Att söka på Upwork verkar enkelt tills du gör det varje dag. Flikar staplas på hög, “kanske”-jobb flyter ihop och du missar bra leads för att du såg dem för sent (eller glömde var du sparade dem).
Om du är frilansare som jagar jämn tillgång på uppdrag känner du redan till slitjobbet. Byråägare som följer flera kategorier känner det också, och konsulter som behöver kunder med bättre matchning drabbas hårdast. Den här automatiseringen för Upwork lead scoring filtrerar bort bruset och lyfter fram möjligheterna som är värda att svara på.
Du sätter upp ett n8n-flöde som hämtar jobb enligt schema, poängsätter dem med GPT-4, loggar allt i Google Sheets, skriver förslag och pingar dig i Telegram så att du kan agera snabbt.
Så fungerar automatiseringen
Här är hela flödet du kommer att sätta upp:
n8n Workflow Template: Från Upwork till Google Sheets: leads poängsätts
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", 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/httprequest.dark.svg' width='40' height='40' /></div><br/>Run Apify Scraper"]
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/>Get Dataset Items"]
n3@{ icon: "mdi:database", form: "rounded", label: "Read Existing Job IDs", 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/code.svg' width='40' height='40' /></div><br/>Filter Duplicates"]
n5@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Has New Jobs?", pos: "b", h: 48 }
n6["<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/>Normalize Fields"]
n7@{ icon: "mdi:robot", form: "rounded", label: "AI Scoring", 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/>Parse AI Score"]
n9@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Score = 60", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n11@{ icon: "mdi:robot", form: "rounded", label: "Generate Proposal", pos: "b", h: 48 }
n12@{ icon: "mdi:database", form: "rounded", label: "Log to Google Sheet", pos: "b", h: 48 }
n13@{ icon: "mdi:cog", form: "rounded", label: "Loop Complete", pos: "b", h: 48 }
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/code.svg' width='40' height='40' /></div><br/>Compute Metrics"]
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/telegram.svg' width='40' height='40' /></div><br/>Send Summary"]
n16@{ icon: "mdi:cog", form: "rounded", label: "No New Jobs", pos: "b", h: 48 }
n7 --> n8
n5 --> n6
n5 --> n16
n13 --> n14
n8 --> n9
n14 --> n15
n10 --> n13
n10 --> n11
n6 --> n7
n0 --> n1
n4 --> n5
n11 --> n12
n2 --> n3
n1 --> n2
n9 --> n10
n12 --> n10
n3 --> n4
end
subgraph sg1["Error Flow"]
direction LR
n17@{ icon: "mdi:play-circle", form: "rounded", label: "Error Trigger", 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 Error Alert"]
n17 --> n18
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,n17 trigger
class n7,n11 ai
class n5,n9 decision
class n3,n12 database
class n1,n2 api
class n4,n6,n8,n14 code
classDef customIcon fill:none,stroke:none
class n1,n2,n4,n6,n8,n14,n15,n18 customIcon
Varför det här spelar roll: Upwork-sökning skapar onödigt merarbete
Att manuellt leta Upwork-jobb är bedrägligt dyrt. Du läser samma luddiga briefar, öppnar en massa inlägg som “kan vara bra”, och inser sedan att budgeten är fel eller att kundhistoriken är ett kaos. Under tiden har de bästa projekten fått 20 förslag innan du ens ser dem. Det handlar inte bara om tid. Det är den mentala belastningen av att avgöra vad som förtjänar din uppmärksamhet och sedan försöka minnas vilka leads du redan granskat så att du inte slösar tid på att kolla dem igen i morgon.
Friktionen byggs på. Så här faller det isär i verkligheten.
- Du skannar samma annonser igen eftersom det inte finns något pålitligt “sett”-system kopplat till ett jobb-ID.
- Kvalitet blandas med skräp, vilket innebär att du lägger ungefär en timme om dagen på att läsa inlägg du aldrig kommer att söka.
- Även när du hittar ett starkt lead tar det så lång tid att skriva ett anpassat första utkast att du svarar för sent.
- Utan en enkel logg är det svårt att se mönster i vad du vinner, vad du förlorar och vad du ska sluta jaga.
Det du bygger: poängsatta Upwork-leads + utkast till förslag i Sheets
Det här flödet körs automatiskt var 6:e timme (du kan ändra det). Det använder en Apify-scraper för att hämta Upwork-jobb som matchar dina kriterier, jämför dem sedan med jobb-ID:n som redan finns lagrade i ditt Google Sheet så att du bara granskar nya möjligheter. Därefter utvärderar GPT-4 varje jobb utifrån matchning, kundkvalitet och budget och sätter en enkel poäng 0–100. Allt under din tröskel rensas bort. Allt över går vidare till att skapa förslagsutkast, så du får ett redigeringsklart utkast och en strukturerad logg över vad som hände. Till sist skickar Telegram en sammanfattning, så att du kan hoppa på de bästa leadsen utan att bo i Upwork hela dagen.
Flödet startar enligt schema, hämtar annonser och tar bort dubbletter. Sedan poängsätter och filtrerar AI fram de bästa jobben, skriver förslag för dem, loggar resultaten i Google Sheets och skickar en Telegram-sammanfattning så att du vet exakt vad du ska granska.
Det du bygger
| Det som automatiseras | Det du uppnår |
|---|---|
|
|
Förväntade resultat
Säg att du kollar Upwork 4 gånger om dagen och lägger cirka 20 minuter varje gång på att skanna, öppna flikar och kortlista. Det är ungefär 80 minuter per dag, och det ger fortfarande inget utkast till förslag. Med det här flödet som körs var 6:e timme lägger du kanske 5 minuter på att granska Telegram-sammanfattningen och ditt sheet, och redigerar sedan de förskrivna utkasten för de få jobb som får 60+. De flesta dagar är det ungefär en timme tillbaka.
Innan du börjar
- n8n-instans (testa n8n Cloud gratis)
- Alternativ för egen hosting om du föredrar det (Hostinger fungerar bra)
- Google Sheets för att lagra jobb-ID:n, poäng och utkast.
- Apify för att köra en Upwork-scraper-actor.
- OpenAI API-nyckel (hämta den i OpenAI:s API-dashboard)
Nivå: Nybörjare. Du kopplar konton, lägger till en kolumn i Sheet och klistrar in några ID:n i miljövariabler.
Vill du att någon bygger detta åt dig? Prata med en automationsexpert (gratis 15-minuters konsultation).
Steg för steg
Ett schema sätter igång allt. n8n kör flödet var 6:e timme, så du slipper förlita dig på “jag kollar senare”-viljestyrka.
Upwork-jobb samlas in och struktureras. Apify hämtar annonser som matchar dina sparade kriterier, sedan läser flödet in dina befintliga jobb-ID:n från Google Sheets och tar bort allt du redan sett.
AI avgör vad som är värt din uppmärksamhet. GPT-4 bedömer matchning, kundkvalitet och budget, sedan plockar flödet ut en poäng 0–100 och filtrerar så att bara jobb med 60+ behålls.
Kvalificerade jobb får utkast och loggas. För varje annons med hög poäng genererar n8n ett förslagsutkast, lägger till detaljerna i ditt Google Sheet och räknar kör-mått (hur många hittade, hur många behölls och så vidare). Telegram skickar en sammanfattning, plus ett felmeddelande om något misslyckas.
Du kan enkelt ändra poängtröskeln (60+) efter hur kräsen du vill vara och justera schemat om du vill ha snabbare aviseringar. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: konfigurera schematriggern
Ställ in arbetsflödet så att det körs enligt ett fast schema för att starta cykeln för jobbscraping.
- Lägg till och öppna Scheduled Automation Start.
- Ställ in schemaregeln så att den körs var 6:e timme.
- Bekräfta att noden är kopplad till Launch Apify Crawl för att starta scrapingkörningen.
Steg 2: anslut Apify-crawling och hämtning av dataset
Trigga Apify-aktorn och hämta datasetobjekten för utvärdering.
- Öppna Launch Apify Crawl och ställ in Method till
POST. - Ställ in URL till
=https://api.apify.com/v2/acts/{{ $env.APIFY_ACTOR_ID }}/runs?waitForFinish=300. - Aktivera Send Body och ställ in JSON Body till den angivna filterpayloaden (tim-/fasta budgetar, kategorier, gräns 100).
- Inloggningsuppgifter krävs: Anslut era HTTP Header Auth-inloggningsuppgifter i Launch Apify Crawl.
- Öppna Retrieve Dataset Records och ställ in URL till
=https://api.apify.com/v2/datasets/{{ $json.data.defaultDatasetId }}/items?clean=true. - Inloggningsuppgifter krävs: Anslut era HTTP Header Auth-inloggningsuppgifter i Retrieve Dataset Records.
APIFY_ACTOR_ID är satt i era miljövariabler, annars blir Apify-URL:en ogiltig.Steg 3: anslut Google Sheets och avduplicera jobb
Läs in befintliga jobb-ID:n från Google Sheets och filtrera bort annonser som redan setts innan poängsättning.
- Öppna Load Stored Job IDs och ställ in Sheet Name till
Upwork Jobs. - Ställ in Document ID till
={{ $env.GOOGLE_SHEETS_DOC_ID }}. - Inloggningsuppgifter krävs: Anslut era Google Sheets-inloggningsuppgifter i Load Stored Job IDs.
- Granska Remove Seen Listings så att endast jobb vars
uidinte finns i arkets kolumnJob IDbehålls. - Öppna Check For New Jobs och bekräfta att villkoret använder
={{ $json.uid }}med notEmpty-logik. - Verifiera att falsk-vägen routas till No New Roles Path för körningar utan nya jobb.
Job ID i ert ark—saknade eller omdöpta kolumner gör att dubbletter släpps igenom.Steg 4: sätt upp AI-pipelinen för poängsättning
Normalisera jobbfält, poängsätt dem med AI och filtrera fram möjligheter med hög kvalitet.
- Öppna Standardize Job Fields och behåll koden som mappar rå jobbdata till normaliserade fält som
jobId,titleochbudget. - Konfigurera AI Fit Evaluation att använda modellen
gpt-4o. - Inloggningsuppgifter krävs: Anslut era OpenAI-inloggningsuppgifter i AI Fit Evaluation.
- Bekräfta att Extract Score Result tolkar AI-svarets JSON och mappar
score,decisionochreasoning. - Öppna Filter High Scores och ställ in villkoret till
={{ $json.score }}gte60.
Steg 5: konfigurera förslagsutkast och loggning i arket
Batcha kvalificerade jobb, skapa förslagsutkast och lägg till resultaten i ert loggark.
- Öppna Iterate Qualified Jobs för att dela upp jobb i batchar för sekventiell bearbetning.
- Konfigurera Draft Proposal Text med modellen
gpt-4o-miniför att generera förslagsutkast. - Inloggningsuppgifter krävs: Anslut era OpenAI-inloggningsuppgifter i Draft Proposal Text.
- Öppna Append to Sheet Log och ställ in Operation till
append. - Ställ in Sheet Name till
Upwork Jobsoch Document ID till={{ $env.GOOGLE_SHEETS_DOC_ID }}. - Inloggningsuppgifter krävs: Anslut era Google Sheets-inloggningsuppgifter i Append to Sheet Log.
- Verifiera loopen: Iterate Qualified Jobs skickar ut till Draft Proposal Text och sedan till Append to Sheet Log, som returnerar till Iterate Qualified Jobs tills allt är klart.
Steg 6: konfigurera körningsmätvärden och Telegram-sammanfattning
Sammanfatta körningen och skicka en notis när bearbetningen är klar.
- Öppna Batch Loop End och säkerställ att den är kopplad till Calculate Run Metrics.
- Granska Calculate Run Metrics för att beräkna antal
scrapedochpassedmed data från Retrieve Dataset Records och Extract Score Result. - Öppna Dispatch Telegram Summary och ställ in Text till
=✅ Upwork Scraper Done Scraped: {{ $json.scraped }} Passed: {{ $json.passed }}. - Ställ in Chat ID till
={{ $env.TELEGRAM_CHAT_ID }}. - Inloggningsuppgifter krävs: Anslut era Telegram-inloggningsuppgifter i Dispatch Telegram Summary.
TELEGRAM_CHAT_ID inte är satt i era miljövariabler kommer sammanfattningsmeddelandet inte att levereras.Steg 7: lägg till felhantering
Fånga upp fel i arbetsflödet och notifiera er Telegram-kanal direkt.
- Öppna Error Catch Trigger för att säkerställa att den är redo att fånga upp fel i arbetsflödet.
- Konfigurera Send Failure Notice med Text satt till
=🚨 Error: {{ $json.error?.message || 'Unknown' }}. - Ställ in Chat ID till
={{ $env.TELEGRAM_CHAT_ID }}. - Inloggningsuppgifter krävs: Anslut era Telegram-inloggningsuppgifter i Send Failure Notice.
Steg 8: testa och aktivera ert arbetsflöde
Kör ett manuellt test för att bekräfta att varje nod körs korrekt och aktivera därefter schemat.
- Klicka på Execute Workflow för att trigga Scheduled Automation Start manuellt.
- Bekräfta att Launch Apify Crawl och Retrieve Dataset Records returnerar jobbdata och att Check For New Jobs routar korrekt.
- Verifiera att jobb med hög poäng passerar Filter High Scores och loggas i Append to Sheet Log med framtagna förslagsutkast.
- Kontrollera att Dispatch Telegram Summary skickar en sammanfattning med antal
scrapedochpassed. - Växla arbetsflödet till Active för att aktivera schemalagda körningar var 6:e timme.
Felsökningstips
- Google Sheets-inloggning kan gå ut eller kräva specifika behörigheter. Om något slutar fungera, kontrollera först Google-anslutningen i n8n:s panel för inloggningsuppgifter.
- Apify-körningar kan ta längre tid än väntat beroende på datasetets storlek. Om “Retrieve Dataset Records” ibland returnerar tomt, kör om flödet eller lägg till en längre väntetid innan du hämtar resultat.
- Standardprompter i AI-noder är generiska. Lägg in din nisch, bevispunkter och “så här jobbar jag” tidigt, annars kommer du att redigera output för alltid.
Snabba svar
Cirka 15 minuter om dina konton är redo.
Nej. Du kopplar inloggningsuppgifter och fyller i några ID:n och variabler i n8n.
Ja. n8n har ett gratis alternativ för egen hosting och en gratis provperiod på n8n Cloud. Cloud-planer börjar på 20 $/månad för högre volym. Du behöver också räkna in Apify + OpenAI-användning, vilket vanligtvis ligger på cirka 0,50–3,00 $ per körning för det här flödet.
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller egen hosting på en VPS. För egen hosting är Hostinger VPS prisvärd och klarar n8n bra. Egen hosting ger dig obegränsat antal körningar men kräver grundläggande serverhantering.
Ja, och det bör du. De flesta börjar med att ändra schemat “körs var 6:e timme”, byta Apify-actor för att rikta in sig på andra jobbkategorier och justera filtertröskeln “60+”. Du kan också skriva om prompterna i noderna AI Fit Evaluation och Draft Proposal Text så att de matchar din nisch (e-handel, SaaS, design, vad som helst) och din ton. Om du vill ha andra output, logga extra kolumner i Google Sheets-steget “Append”, som kundens spend, tidszon eller en riskflagga.
Oftast är det chatt-ID:t eller botbehörigheter. Bekräfta att din miljövariabel TELEGRAM_CHAT_ID är korrekt, kontrollera sedan Telegram-inloggningen i n8n och skicka ett testmeddelande igen. Om flödet inte kan meddela dig efter ett fel tappar du säkerhetsnätet, så det är värt att fixa först.
Mer än tillräckligt för en typisk frilansare eller liten byrå; den praktiska begränsningen är din n8n-plan och din budget för Apify/OpenAI-användning.
Ofta, ja, eftersom det här flödet drar nytta av förgreningar, avdupliceringslogik, loopar över items och felhantering utan att du betalar extra per “väg”. n8n ger dig också möjligheten att hosta själv, vilket kan spela roll om du kör det 4 gånger om dagen och loggar många rader. Zapier eller Make kan fortfarande fungera om du bara vill ha “scrapa → avisera” och inget mer. Men när du lägger till poängsättning, filtrering, utkast och strukturerad loggning brukar n8n kännas mindre trångt. Prata med en automationsexpert om du vill ha hjälp att välja.
Sätt upp det här en gång, så förvandlas ditt Upwork-flöde till en prioriterad, sökbar leadlista med utkast kopplade. Det är ärligt talat skillnaden mellan “jag söker senare” och att skicka starka förslag medan jobbet fortfarande är färskt.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.