Att kolla Upwork “en gång till” blir snabbt en daglig rutin. Du scrollar, öppnar flikar, kopierar länkar, klistrar in anteckningar och glömmer sedan vilka du redan har granskat.
Den här automationen för att spåra leads på Upwork träffar frilansare först (för tid är debiterbar), men byråägare och marknadskonsulter känner av den också. I stället för att jaga jobb får du en strukturerad lista i Google Sheets plus en daglig e-postsammanfattning som du kan agera på direkt.
Nedan ser du hur workflowet hämtar nya Upwork-jobb via Apify, avduplicerar dem, uppdaterar nyckelordsstatistik och skickar en enkel daglig rapport som hjärnan faktiskt kan ta in.
Så fungerar den här automationen
Här är hela workflowet som du kommer att sätta upp:
n8n Workflow Template: Apify + Google Sheets: Upwork-leads spårade
flowchart LR
subgraph sg0["Manual Execution Start Flow"]
direction LR
n0@{ icon: "mdi:database", form: "rounded", label: "Purge Sheet Rows", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Iterate Keyword List", pos: "b", h: 48 }
n2@{ icon: "mdi:play-circle", form: "rounded", label: "Manual Execution Start", pos: "b", h: 48 }
n3@{ icon: "mdi:database", form: "rounded", label: "Retrieve Keyword Sheet", 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/httprequest.dark.svg' width='40' height='40' /></div><br/>Start Apify Actor"]
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/>Poll Actor Status"]
n6@{ icon: "mdi:cog", form: "rounded", label: "Pause Before Dataset", 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/httprequest.dark.svg' width='40' height='40' /></div><br/>Get Scraped Dataset"]
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/>Filter Recent Jobs"]
n9@{ icon: "mdi:database", form: "rounded", label: "Append Daily Jobs", pos: "b", h: 48 }
n10@{ icon: "mdi:database", form: "rounded", label: "Refresh Keyword Totals", pos: "b", h: 48 }
n11@{ icon: "mdi:database", form: "rounded", label: "Load Daily Job Rows", pos: "b", h: 48 }
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/>Deduplicate Job Posts"]
n13@{ icon: "mdi:database", form: "rounded", label: "Store Clean Listings", pos: "b", h: 48 }
n14@{ icon: "mdi:database", form: "rounded", label: "Reload Clean Listings", 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/code.svg' width='40' height='40' /></div><br/>Compute Keyword Stats"]
n16@{ icon: "mdi:database", form: "rounded", label: "Update Summary Table", pos: "b", h: 48 }
n17@{ icon: "mdi:database", form: "rounded", label: "Fetch Summary Data", 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/code.svg' width='40' height='40' /></div><br/>Compose Report Body"]
n19@{ icon: "mdi:message-outline", form: "rounded", label: "Dispatch Daily Email", pos: "b", h: 48 }
n18 --> n19
n2 --> n3
n13 --> n0
n8 --> n9
n16 --> n17
n1 --> n11
n1 --> n4
n14 --> n15
n4 --> n5
n17 --> n18
n9 --> n10
n10 --> n1
n6 --> n7
n7 --> n8
n11 --> n12
n5 --> n6
n15 --> n16
n12 --> n13
n0 --> n14
n3 --> n1
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 n2 trigger
class n0,n3,n9,n10,n11,n13,n14,n16,n17 database
class n4,n5,n7 api
class n8,n12,n15,n18 code
classDef customIcon fill:none,stroke:none
class n4,n5,n7,n8,n12,n15,n18 customIcon
Varför det här spelar roll: Upwork-leads missas (och dupliceras)
Leadgen på Upwork ser enkelt ut tills du gör det varje dag. Du söker på en handfull nyckelord, skummar samma resultat och oroar dig ändå för att du missade det perfekta jobbet som lades upp över natten. Sedan kommer det röriga: att spara annonser någonstans som faktiskt är användbart, komma ihåg varför du gillade dem och undvika det klassiska “jag har redan ansökt till den här… eller?”-ögonblicket. Den verkliga kostnaden är inte bara tiden. Det är den mentala belastningen av att spåra leads över flikar, anteckningar och halvfärdiga kalkylark, vilket gör dig långsammare att pitcha.
Det bygger upp snabbt. Här är var det vanligtvis faller isär i verkligheten:
- Att manuellt granska flera nyckelord kan ta ungefär en timme per dag, särskilt när du öppnar och stänger 20+ jobbflikar.
- Dubbletter smyger sig in när ett jobb matchar mer än ett nyckelord, vilket gör ditt “sparade leads”-ark brusigt och svårt att lita på.
- Leads blir inaktuella eftersom du inte har ett konsekvent “postat de senaste 24 timmarna”-filter i varje sökning.
- Utan nyckelordstotaler och en daglig sammanställning fortsätter du gissa vilken nisch som faktiskt genererar jobb.
Vad du bygger: Daglig Upwork-scraping → Sheet + e-postsammanfattning
Det här workflowet gör Upwork-browsing till ett repeterbart dagligt inflödessystem. Du har din nyckelordslista i Google Sheets, kör workflowet och n8n loopar igenom varje nyckelord för att trigga en Apify-scraper. När Apify är klar hämtar workflowet datasetet, filtrerar annonser till senaste dygnet och formaterar varje jobb till strukturerade kolumner (titel, beskrivning, budget, betyg, länk, nyckelord, tidsstämplar). Sedan avduplicerar det poster så att samma jobb inte skräpar ner ditt ark bara för att det matchade två sökningar. Till sist räknar det fram sammanfattande statistik och skickar ett prydligt dagligt mejl så att du kan granska leads på några minuter och pitcha medan jobbet fortfarande är färskt.
Workflowet börjar med ditt nyckelordsark. Därifrån samlar Apify in matchande jobb och n8n städar upp dem, tar bort upprepningar och uppdaterar dina dagliga flikar och sammanfattningsflikar. Sista steget är en Gmail-sändning som lägger en strukturerad rapport i din inkorg med nyckeltalen och en länk till arket.
Det du bygger
| Vad som automatiseras | Vad du uppnår |
|---|---|
|
|
Förväntade resultat
Säg att du spårar 12 nyckelord. Manuellt kanske du lägger cirka 5 minuter per nyckelord på att söka, öppna annonser och spara de som är värda en pitch, vilket blir ungefär en timme per dag. Med det här workflowet kör du det en gång och skummar sedan mejlet plus det rensade Google Sheet-arket på cirka 10 minuter. Även om Apify tar lite tid att bli klar i bakgrunden så gör du inte jobbet. Det är nära en timme tillbaka de flesta vardagar.
Innan du börjar
- n8n-instans (prova n8n Cloud gratis)
- Alternativ för egen hosting om du föredrar det (Hostinger fungerar bra)
- Apify för att scrapa Upwork-jobbannonser
- Google Sheets för att lagra nyckelord, jobb och sammanfattningar
- E-postkonto (Gmail/SMTP) för att skicka den dagliga rapporten
- Apify API-token (hämta den i Apify Console → Integrations)
Svårighetsgrad: Nybörjare. Du kopplar konton, bekräftar kolumner i arket och klistrar in en API-token.
Vill du att någon bygger detta åt dig? Prata med en automationsexpert (gratis 15-minuters konsultation).
Steg för steg
Du startar körningen på beställning. Workflowet använder en manuell trigger, vilket är perfekt för test och för att köra när du vill göra dagens hämtning. Många team byter senare till ett dagligt schema när de litar på resultaten.
Nyckelorden kommer från Google Sheets. n8n läser ditt ark “All Keywords” (eller “AI Keywords”) och loopar igenom varje aktiv term. Listan blir din kontrollpanel, så att ändra vad du scrapar är lika enkelt som att redigera en cell.
Apify scrapar Upwork och returnerar ett dataset. För varje nyckelord triggar n8n Apify-aktorn via en HTTP-request, pollar tills den är klar, väntar en kort stund och hämtar sedan datasetet. Efter det filtrerar kodnoder jobb till senaste 24 timmarna och normaliserar fält som budget, betyg och jobb-URL:en.
Strukturerade poster hamnar i Google Sheets och rapporten skickas. Workflowet lägger till jobb i ditt dagliga ark, tar bort dubbletter via titel/beskrivning, uppdaterar nyckelordstotaler och sammanfattningsstatistik, bygger sedan en e-posttext och skickar den via Gmail.
Du kan enkelt ändra filtreringsreglerna (budget, kundbetyg, jobbtyp) så att de matchar din nisch. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementation
Steg 1: konfigurera manuell trigger
Det här arbetsflödet startas manuellt så att ni kan styra när scraping och rapportering körs.
- Lägg till eller bekräfta noden Manual Execution Start som trigger.
- Lämna alla fält på standardvärden, eftersom den här noden inte har några parametrar att konfigurera.
- Koppla Manual Execution Start till Retrieve Keyword Sheet för att starta inläsningen av nyckelord.
Steg 2: anslut Google Sheets
Flera noder läser och skriver jobbdata och nyckelordssammanställningar i Google Sheets.
- I Retrieve Keyword Sheet ställer ni in Document till
[YOUR_ID]och väljer Sheet med namnetAll Keywords combined. - I Load Daily Job Rows ställer ni in Document till
[YOUR_ID]och Sheet till15 July 2025. - I Append Daily Jobs bekräftar ni att kolumnmappningarna inkluderar uttryck som
{{ $json.title == undefined ? "No records found in last 24 hours": $json.title }}och{{ $('Iterate Keyword List').item.json.Keywords }}. - I Refresh Keyword Totals ställer ni in Keywords till
{{ $('Iterate Keyword List').item.json.Keywords }}och Total Count 15-07-2025 till{{ $('Filter Recent Jobs').first().json.title == undefined ? "0" : $('Filter Recent Jobs').all().length }}. - I Store Clean Listings och Reload Clean Listings behåller ni samma Document- och Sheet-mål för att bevara dataflödet.
- I Update Summary Table och Fetch Summary Data väljer ni arket
All Keywords combinedför att behålla rapporteringstotalerna.
Inloggning krävs: Koppla era googleApi-inloggningsuppgifter till alla Google Sheets-noder (9+ noder hanterar nyckelord, jobbrader och sammanställningar).
Steg 3: konfigurera Apify-scrapingförfrågningarna
Dessa noder startar Apify-aktorn, pollar efter slutförande, väntar och hämtar datasetet.
- I Start Apify Actor ställer ni in URL till
https://api.apify.com/v2/acts/[YOUR_ID]/runsoch säkerställer att Method ärPOST. - Ställ in JSON Body i Start Apify Actor till den angivna payloaden, inklusive
"query": "{{ $json.Keywords }}"och"maxJobAge": { "value": 23, "unit": "hours" }. - I Poll Actor Status ställer ni in URL till
https://api.apify.com/v2/actor-runs/{{ $json.data.id }}och behåller waitForFinish som150. - I Pause Before Dataset ställer ni in Amount till
20sekunder. - I Get Scraped Dataset ställer ni in URL till
https://api.apify.com/v2/datasets/{{ $json.data.defaultDatasetId }}/items.
Inloggning krävs: Koppla era httpHeaderAuth-inloggningsuppgifter till Start Apify Actor, Poll Actor Status och Get Scraped Dataset.
[YOUR_ID] i Apify-URL:erna med era faktiska actor- och dataset-ID:n, annars kommer anropen att misslyckas.Steg 4: sätt upp iteration av nyckelord och filtrering av jobb
Det här steget loopar igenom nyckelord, kör scraping, filtrerar resultaten och skriver dagliga rader.
- Koppla Retrieve Keyword Sheet till Iterate Keyword List för att loopa igenom varje nyckelord.
- Iterate Keyword List skickar output parallellt till både Load Daily Job Rows och Start Apify Actor.
- I Filter Recent Jobs behåller ni JavaScript-koden som filtrerar på de senaste
23timmarna för att säkerställa att endast nya annonser behålls. - I Append Daily Jobs verifierar ni att mappningen för Keyword Title använder
{{ $('Iterate Keyword List').item.json.Keywords }}. - Bekräfta att loopbacken från Refresh Keyword Totals till Iterate Keyword List är intakt så att alla nyckelord bearbetas.
Steg 5: avduplicera och lagra rena listningar
Efter att dagliga rader har lästs in tas dubbletter bort och rena listningar lagras och läses in igen för statistik.
- I Deduplicate Job Posts behåller ni Set-baserad logik som jämför
titleochdescriptionoch hoppar över “No records found in last 24 hours.” - I Store Clean Listings säkerställer ni att mappningarna inkluderar
{{ $json.title }},{{ $json.description }}och{{ $json['Keyword Title'] }}. - I Purge Sheet Rows behåller ni Number to Delete satt till
{{ $('Load Daily Job Rows').all().length }}för att rensa gammal data. - Verifiera att Purge Sheet Rows skickar output till Reload Clean Listings för steget med sammanställningsberäkningar.
Steg 6: bygg sammanställningen och e-postrapporten
Sammanställ nyckelordstotaler, skapa en rapporttext och skicka ett dagligt e-postmeddelande.
- I Compute Keyword Stats behåller ni koden som jämför
$('Reload Clean Listings').all()med$('Store Clean Listings').all(). - I Update Summary Table mappar ni Keywords till
{{ $json.keyword }}och Total Count 15-07-2025 till{{ $json.count }}. - I Compose Report Body verifierar ni att output-strukturen inkluderar
date: "15-07-2025"ochcounts_by_type. - I Dispatch Daily Email ställer ni in Send To till
[YOUR_EMAIL]och behåller meddelandeuttryck som{{ $('Deduplicate Job Posts').all().length }}och{{ $json.counts_by_type.Web }}.
Inloggning krävs: Koppla era gmailOAuth2-inloggningsuppgifter till Dispatch Daily Email.
15-07-2025) i Compute Keyword Stats, Compose Report Body och e-postämnet för att undvika att rapporten märks med ett gammalt datum.Steg 7: testa och aktivera ert arbetsflöde
Kör arbetsflödet manuellt för att verifiera dataflödet och aktivera det sedan för produktion.
- Klicka på Execute Workflow och bekräfta att Manual Execution Start triggar hela sekvensen.
- Kontrollera Google Sheets för att bekräfta att Append Daily Jobs lägger till rader och att Update Summary Table uppdaterar antal.
- Verifiera att Dispatch Daily Email skickar ett meddelande med totaler ifyllda från
{{ $json.counts_by_type.Web }}och{{ $json.counts_by_type.Mobile }}. - När allt är verifierat växlar ni arbetsflödet till Active för produktion.
Felsökningstips
- Behörigheter i Google Sheets är boven #1. Om rader inte skrivs, öppna n8n:s Google Sheets-credential, autentisera igen och bekräfta att den har åtkomst till exakt rätt kalkylark.
- Om du använder Wait-noder eller extern scraping varierar processtiderna. Öka väntetiden om efterföljande HTTP-requests misslyckas för att Apify-datasetet inte är klart ännu.
- Gmail-sändning kan misslyckas om du inte har aktiverat rätt autentiseringsmetod. Kontrollera din Gmail-credential i n8n och verifiera att “From”-adressen matchar det auktoriserade kontot.
Snabba svar
Cirka 30 minuter om dina Sheets och konton är redo.
Nej. Du kopplar främst Apify, Google Sheets och Gmail, och bekräftar sedan att kolumnerna i arket matchar vad workflowet förväntar sig.
Ja. n8n har ett gratis alternativ för egen hosting 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 Apify-användning, eftersom API-anrop kan ge en liten daglig kostnad beroende på hur många nyckelord du scrapar.
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 hanterar n8n bra. Egen hosting ger dig obegränsade körningar men kräver grundläggande serveradministration.
Ja, och den är byggd för det. De flesta börjar med att ändra nyckelordsarket och justerar sedan stegen “Filter Recent Jobs” och “Deduplicate Job Posts” för att matcha sin nisch. Vanliga ändringar är att filtrera bort låga budgetar, kräva ett minimibetyg från kunden eller bara behålla fastprisroller (eller timroller). Du kan också byta ut Gmail-sändningen mot en annan e-postleverantör utan att ändra resten av logiken.
Oftast handlar det om en ogiltig eller utgången Apify API-token. Skapa en ny token i Apify, klistra in den i n8n-credentialn för HTTP Request och kör sedan om ett enda nyckelord för att testa. Om aktorn startar men aldrig returnerar data, kontrollera Apifys körloggar för blockerade sidor, rate limits eller felkonfigurerad sökinput. Bekräfta också att workflowet pollar rätt run ID och hämtar rätt dataset.
Mer än tillräckligt för typisk daglig prospektering: dussintals nyckelord och hundratals jobbrader per dag är normalt, så länge din Apify-plan och dina Google Sheets-gränser klarar det.
Ofta, ja, eftersom det här flödet har loopar, polling, avdupliceringslogik och flerstegsuppdateringar i Sheets som blir klumpiga (och dyra) i enklare verktyg. n8n ger dig också möjlighet till egen hosting, vilket innebär att du inte betalar per mikrosteg när du skalar. Zapier eller Make kan fortfarande vara helt okej om du gör en enkel automation av typen “ny rad → skicka mejl”. Men scraping plus rensning plus sammanfattningar är där n8n brukar kännas mer hanterbart. Om du vill ha en second opinion om vad som är realistiskt för din volym, prata med en automationsexpert.
När detta väl rullar slutar du “kolla Upwork” och börjar i stället granska en kort, strukturerad lista. Workflowet tar hand om det repetitiva så att du kan fokusera på att pitcha och stänga.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.