Att manuellt leta igenom GitHub efter bounty-ärenden ser enkelt ut tills du gör det varje dag. Flikarna blir fler, du glömmer vad du redan har kollat, och de bästa “💎 Bounty”-ärendena hinner bli tagna medan du fortfarande kopierar länkar till ett kalkylark.
Den här GitHub bounty tracker-automationen hjälper frilansare först (för att hastighet spelar roll), men utvecklingsansvariga på byrå och community managers känner av samma kaos. Du får ett strukturerat Google-kalkylark med alla bounty-ärenden som hittas, plus ett e-postlarm när något nytt är värt att hoppa på.
Du ser exakt hur arbetsflödet hittar ärenden med bounty-etikett, förhindrar dubbletter, loggar dem till två ark och håller statusar uppdaterade så att din “leadlista” förblir korrekt.
Så fungerar automationen
Hela n8n-arbetsflödet, från trigger till slutresultat:
n8n Workflow Template: GitHub till Google Sheets: logga bounty-leads snabbt
flowchart LR
subgraph sg0["Hourly Schedule Kickoff Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Hourly Schedule Kickoff", pos: "b", h: 48 }
n1@{ icon: "mdi:database", form: "rounded", label: "Retrieve Sheet1 Rows", 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/httprequest.dark.svg' width='40' height='40' /></div><br/>Search GitHub Issues"]
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Expand Issue Items", 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/merge.svg' width='40' height='40' /></div><br/>Combine Issue Streams"]
n5@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Exclude Existing Issues", pos: "b", h: 48 }
n6@{ icon: "mdi:database", form: "rounded", label: "Append New Issues", 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/whatsapp.svg' width='40' height='40' /></div><br/>Dispatch WhatsApp Alert"]
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/html.dark.svg' width='40' height='40' /></div><br/>Build HTML Template"]
n9@{ icon: "mdi:message-outline", form: "rounded", label: "Send Email Notice", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Recent Bounties", pos: "b", h: 48 }
n11@{ icon: "mdi:database", form: "rounded", label: "Retrieve Recent Sheet Rows", pos: "b", h: 48 }
n12@{ icon: "mdi:database", form: "rounded", label: "Log Recent Bounties", pos: "b", h: 48 }
n8 --> n9
n4 --> n5
n5 --> n6
n10 --> n7
n3 --> n4
n7 --> n8
n9 --> n12
n0 --> n2
n0 --> n1
n0 --> n11
n6 --> n10
n1 --> n4
n11 --> n3
n2 --> n3
end
subgraph sg1["Six-Hour Update Flow"]
direction LR
n13@{ icon: "mdi:database", form: "rounded", label: "Fetch Sheet2 Entries", pos: "b", h: 48 }
n14@{ icon: "mdi:play-circle", form: "rounded", label: "Six-Hour Update Trigger", pos: "b", h: 48 }
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch Issue Details A"]
n16@{ icon: "mdi:database", form: "rounded", label: "Update Sheet2 Status", pos: "b", h: 48 }
n17@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Detect Sheet2 Changes", pos: "b", h: 48 }
n18@{ icon: "mdi:database", form: "rounded", label: "Fetch Sheet1 Entries", 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/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch Issue Details B"]
n20@{ icon: "mdi:database", form: "rounded", label: "Update Sheet1 Status", pos: "b", h: 48 }
n21@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Detect Sheet1 Changes", pos: "b", h: 48 }
n17 --> n16
n21 --> n20
n14 --> n13
n14 --> n18
n13 --> n15
n18 --> n19
n15 --> n17
n19 --> n21
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,n14 trigger
class n5,n10,n17,n21 decision
class n1,n6,n11,n12,n13,n16,n18,n20 database
class n2,n15,n19 api
class n7 disabled
classDef customIcon fill:none,stroke:none
class n2,n4,n7,n8,n15,n19 customIcon
Problemet: GitHub bounty-leads faller mellan stolarna
GitHubs sök är kraftfull, men den är inget system. Du kör en sökning, öppnar tio ärenden och när du har läst dem minns du inte vilka du redan har loggat, vilka som är inaktuella och vilka som är helt nya. Än värre: “bounty”-ärenden förändras snabbt. De stängs, redigeras eller löses av någon som är snabbare. Om du spårar möjligheter för dig själv eller ditt team blir manuell uppföljning ett märkligt deltidsjobb som stjäl fokus från arbetet som faktiskt drar in pengar.
Det summerar sig snabbt. Och det fallerar oftast på samma få ställen.
- Du spårar samma bounty-ärende två gånger eftersom förra veckans anteckningar ligger utspridda i bokmärken, DM:ar och halvfärdiga kalkylark.
- Kontroller varje timme blir inte kontroller varje timme när de bygger på “jag gör det efter lunch”. Det glider, och då missar du de bästa leadsen.
- Statusändringar (stängda ärenden, nya kommentarer, uppdaterade bounty-detaljer) missas, så du slösar tid på att jaga döda möjligheter.
- Notiser blir brusiga när de inte filtreras, vilket gör att du till slut ignorerar dem.
Lösningen: Logga bounty-ärenden automatiskt och larma snabbt
Det här arbetsflödet gör GitHub bounty-discovery till en repeterbar pipeline. Varje timme söker det på GitHub efter öppna ärenden med etiketten “💎 Bounty”, jämför resultatet mot det du redan har i Google Sheets och lägger till allt nytt i din huvudtracker (Sheet1) med nyckeldetaljer och direkta länkar, så att du kan skanna möjligheter på ett ställe. Därefter filtrerar det ner till det som faktiskt är färskt (skapat inom de senaste 5 dagarna) och skickar ett formaterat HTML-e-postlarm. Som tillval kan det även pinga WhatsApp via WhatsApp Business API, men den delen är avstängd som standard så att du kan börja enkelt.
Sedan gör det något som de flesta “lead-insamlare” missar. Var 6:e timme kontrollerar arbetsflödet dina redan loggade ärenden, hämtar uppdaterade ärendedetaljer och uppdaterar statusfält (öppen/stängd, kommentarsändringar) så att du inte jagar spöken. Dina ark hålls aktuella utan att du behöver passa dem.
Det du får: automation vs. resultat
| Vad det här arbetsflödet automatiserar | Resultat du får |
|---|---|
|
|
Exempel: så här ser det ut
Säg att du kollar GitHub bounty-ärenden 3 gånger om dagen via ett par sökningar och repos. Om varje genomgång tar cirka 15 minuter (sök, öppna ärenden, kopiera detaljer till ett ark) blir det ungefär 45 minuter per dag, eller cirka 4 timmar per vecka. Med det här arbetsflödet är “kollen” automatiserad varje timme och loggningen sker också automatiskt. Du lägger kanske 10 minuter om dagen på att granska Sheet1 och svara på de bästa leadsen, eftersom grovjobbet redan är gjort.
Det här behöver du
- n8n-instans (prova n8n Cloud gratis)
- Självhostningsalternativ om du föredrar det (Hostinger fungerar bra)
- GitHub för att söka och läsa ärendedata
- Google Sheets för att lagra loggar i Sheet1 och Sheet2
- Gmail för att skicka HTML-e-postlarm
- GitHub personal access token (skapa den i GitHub Developer Settings)
Kunskapsnivå: Medel. Du kopplar konton, lägger in tokens och säkerställer att dina kolumner i Sheets matchar det som arbetsflödet skriver.
Vill du inte sätta upp detta själv? Prata med en automationsexpert (gratis 15-minuters konsultation).
Så fungerar det
Trigger för timsökning. Enligt schema startar n8n arbetsflödet och kör en GitHub-sökfråga som riktar in sig på öppna ärenden med etiketten “💎 Bounty”. Parallellt laddar det befintliga rader från din Sheet1-tracker så att arbetsflödet vet vad du redan har fångat upp.
Filtrering och deduplicering. Resultaten bryts ut till enskilda ärenden, slås ihop med din befintliga arkdata och filtreras så att bara genuint nya ärenden går vidare. Det är den här delen som håller din tracker felfri – ärligt talat skillnaden mellan “automation” och “spam”.
Loggning och larm. Nya ärenden läggs till i Sheet1, sedan håller ett filter för “senaste bounties” notiser begränsade till objekt skapade de senaste 5 dagarna. Arbetsflödet bygger ett GitHub-stylat HTML-mejl och skickar det via Gmail; WhatsApp-larm finns om du väljer att aktivera den noden senare.
Löpande statusuppdateringar. Ett separat schema kör var 6:e timme, hämtar ärendedetaljer på nytt för poster som redan finns i Sheet1 och Sheet2 och uppdaterar rader när något har ändrats (stängd status, kommentarsaktivitet). Din lista förblir pålitlig utan extra arbete.
Du kan enkelt ändra GitHub-sökfrågan för att fokusera på ett specifikt repo, en org eller en etikettmix utifrån dina behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementation
Steg 1: konfigurera schematriggrarna
Konfigurera de två schematriggrarna som kör den timvisa bounty-skanningen och statusuppdateringen var sjätte timme.
- Öppna Hourly Schedule Kickoff och bekräfta att regelintervallet är inställt på timvis (rule → interval → field:
hours). - Öppna Six-Hour Update Trigger och ställ in regelintervallet till var sjätte timme (rule → interval → field:
hours, hoursInterval:6). - Notera parallellbeteendet: Hourly Schedule Kickoff skickar utdata till Search GitHub Issues, Retrieve Sheet1 Rows och Retrieve Recent Sheet Rows parallellt.
- Notera även: Six-Hour Update Trigger skickar utdata till Fetch Sheet2 Entries och Fetch Sheet1 Entries parallellt.
Steg 2: anslut Google Sheets
Det här arbetsflödet använder flera Google Sheets-noder för att lagra ärenden och uppdatera status i Sheet1 och Sheet2.
- Anslut autentiseringsuppgifter för alla Google Sheets-noder (Retrieve Sheet1 Rows, Append New Issues, Retrieve Recent Sheet Rows, Log Recent Bounties, Fetch Sheet2 Entries, Update Sheet2 Status, Fetch Sheet1 Entries, Update Sheet1 Status). Credential Required: Anslut era googleSheetsOAuth2Api-autentiseringsuppgifter.
- I Retrieve Sheet1 Rows, ställ in Document till
public-open-source-bountyoch Sheet tillSheet1. - I Retrieve Recent Sheet Rows, ställ in Document till
public-open-source-bountyoch Sheet tillSheet2. - I Append New Issues, behåll Operation inställt på
appendoch säkerställ att kolumnmappningarna använder befintliga uttryck, till exempel{{ $('Exclude Existing Issues').item.json.html_url }}för Issue URL. - I Log Recent Bounties, behåll Operation inställt på
appendoch behåll befintliga mappningar som{{ $('Filter Recent Bounties').item.json['Issue URL'] }}. - I Update Sheet1 Status och Update Sheet2 Status, behåll Operation inställt på
updateoch behåll matchingColumns somrow_number.
Steg 3: konfigurera hämtning av GitHub-ärenden och merge-logik
Konfigurera GitHub-sökningen, splitta ut ärendeobjekt, slå ihop med befintliga rader i arket och filtrera bort dubbletter.
- Öppna Search GitHub Issues och bekräfta att query-parametrarna är inställda på
q=is:issue label:"💎 Bounty" state:openochper_page=100. Credential Required: Anslut era httpBearerAuth-autentiseringsuppgifter. - Verifiera att paginering i Search GitHub Issues använder
{{ $pageCount + 1 }}och stoppar när{{ $response.body.items.length < 100 }}. - I Expand Issue Items, ställ in Field To Split Out till
items. - I Combine Issue Streams, behåll Mode inställt på
combine, Join Mode påkeepNonMatches, och matchahtml_url(input1) motIssue URL(input2). - I Exclude Existing Issues, behåll filtervillkoret som använder
{{ $('Retrieve Sheet1 Rows').all().map(item => item.json['Issue Name']) }}som inte innehåller{{ $json.title }}.
Steg 4: konfigurera aviseringar och e-postformatering
Konfigurera WhatsApp-aviseringar, bygg HTML-mejlet och skicka e-postnotisen för nya bounties.
- I Dispatch WhatsApp Alert, ställ in Operation till
sendoch ersätt Phone Number ID och Recipient Phone Number med era ID:n. Credential Required: Anslut era whatsAppApi-autentiseringsuppgifter. - Behåll WhatsApp-meddelandets body-uttryck som det är, till exempel
{{ $('Expand Issue Items').item.json.title }}och{{ $json.created_at }}. - I Build HTML Template, behåll den angivna HTML:en och uttryck som
{{ $('Exclude Existing Issues').item.json.title }}och{{ $json.state === 'open' ? 'status-open' : 'status-closed' }}. - I Send Email Notice, ställ in Send To till er adress och Message till
{{ $json.html }}. Credential Required: Anslut era gmailOAuth2-autentiseringsuppgifter. - Bekräfta körordningen: Dispatch WhatsApp Alert → Build HTML Template → Send Email Notice → Log Recent Bounties.
Steg 5: konfigurera statusuppdatering och uppdateringar i arken
Den här grenen uppdaterar ärendestatus och antal kommentarer var sjätte timme för både Sheet1 och Sheet2.
- I Fetch Issue Details A och Fetch Issue Details B, behåll URL-uttrycket
{{ $json['Issue Repo URL'].replace('https://github.com/', 'https://api.github.com/repos/') + '/issues/' + $json['Issue Number'] }}. Credential Required: Anslut era httpBearerAuth-autentiseringsuppgifter. - I Detect Sheet2 Changes, behåll OR-villkoret som kontrollerar state-/comment-ändringar med
{{ $json.state }}och{{ $json.comments }}. - I Update Sheet2 Status, verifiera att de mappade värdena använder
{{ $('Fetch Sheet2 Entries').item.json.row_number }},{{ $('Fetch Issue Details A').item.json.state }}och{{ $('Fetch Issue Details A').item.json.comments }}. - I Detect Sheet1 Changes, behåll OR-villkoret som jämför
{{ $json.state }}och{{ $json.updated_at }}mot värden i Sheet1. - I Update Sheet1 Status, verifiera att de mappade värdena använder
{{ $('Fetch Sheet1 Entries').item.json.row_number }},{{ $('Fetch Issue Details B').item.json.state }}och{{ $('Fetch Issue Details B').item.json.updated_at }}.
Steg 6: testa och aktivera ert arbetsflöde
Verifiera end-to-end-körningen och aktivera sedan arbetsflödet för produktion.
- Klicka Execute Workflow och bekräfta att Hourly Schedule Kickoff triggar den parallella grenen till Search GitHub Issues, Retrieve Sheet1 Rows och Retrieve Recent Sheet Rows.
- Verifiera att nya ärenden passerar genom Exclude Existing Issues och skrivs av Append New Issues.
- Bekräfta att Build HTML Template ger ut HTML och att Send Email Notice skickar ett mejl till
[YOUR_EMAIL]. - Kontrollera Sheet2 för att säkerställa att Log Recent Bounties lade till en ny rad efter att mejlet levererats.
- Aktivera arbetsflödets toggle för att aktivera båda schematriggrarna för kontinuerlig övervakning.
Vanliga fallgropar
- GitHub-inloggningar kan löpa ut eller sakna rätt scopes. Om sökningar plötsligt inte ger något, kontrollera din personal access token i n8n först och bekräfta sedan att den kan läsa de repos du riktar in dig på.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om nedströmsnoder fallerar på tomma svar.
- Standardprompter i AI-noder är generiska. Lägg in din varumärkesröst tidigt, annars kommer du redigera utdata i all evighet.
Vanliga frågor
Cirka 30–60 minuter om ditt Google-ark och din GitHub-token är redo.
Nej. Du klistrar in en GitHub-token, kopplar Google Sheets och Gmail och bekräftar sedan att kolumnerna mappas korrekt.
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 med kostnader för WhatsApp Business API om du aktiverar WhatsApp-larm.
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller självhosting på en VPS. För självhosting är Hostinger VPS prisvärt och klarar n8n bra. Självhosting ger obegränsade körningar men kräver grundläggande serverhantering.
Ja, och det är en av de bästa justeringarna du kan göra. Uppdatera queryn i HTTP Request-noden “Search GitHub Issues” för att rikta in dig på en org, ett repo eller till och med flera etiketter. Många team justerar också logiken i “Filter Recent Bounties” för att bredda eller snäva in 5-dagarsfönstret, och lägger till en enkel regel som hoppar över ärenden utan ett tydligt bounty-belopp.
Oftast är det en utgången Google OAuth-anslutning i n8n, så återanslut dina Google Sheets-uppgifter och välj kalkylarket igen. Kontrollera också att arknamnen matchar det som arbetsflödet förväntar sig (Sheet1 och Sheet2) och att ditt konto har redigeringsåtkomst. Om arbetsflödet kan läsa men inte skriva är det nästan alltid behörigheter.
Många, eftersom den stödjer paginering och bearbetar resultat i batchar.
Ofta, ja. Det här arbetsflödet kör två schemalagda processer (timsvis discovery och 6-timmars uppdateringar), plus dubblettkontroll mot ett ark och villkorade notifieringar – vilket är där Zapier och Make kan bli pilligt eller dyrt. n8n ger dig också möjligheten att självhosta, vilket spelar roll om du kör sökningar ofta. Om du bara vill ha ett grundflöde av typen “nytt GitHub-ärende → lägg till rad” kan Zapier gå snabbare att klicka ihop. Prata med en automationsexpert om du vill ha en ärlig rekommendation utifrån din volym och budget.
När detta väl rullar håller sig din bounty-leadlista uppdaterad utan konstant kontroll. Arbetsflödet tar hand om de repetitiva delarna så att du kan fokusera på att svara och leverera.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.