LinkedIn to Telegram, only high fit job alerts
You open LinkedIn for “a quick check,” and suddenly you’ve read 40 job posts that were never a match. Wrong seniority. Wrong language. “Hybrid” that actually means a two-hour commute. It’s exhausting.
This LinkedIn Telegram alerts automation hits job seekers first, obviously. But recruiters running targeted searches and career coaches helping clients feel the same drag. The outcome is simple: fewer distractions, and a short list of roles that actually fit.
Below you’ll see how the workflow finds LinkedIn roles, filters them with your rules (language, level, commute), scores them against your CV, and then pings you in Telegram only when it’s worth your attention.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: LinkedIn to Telegram, only high fit job alerts
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:swap-vertical", form: "rounded", label: "Config", 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/>Scrape LinkenIn Jobs"]
n2@{ icon: "mdi:cog", form: "rounded", label: "Done!", 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: "If Seniority Match", pos: "b", h: 48 }
n5@{ icon: "mdi:robot", form: "rounded", label: "Deconstruct Job Data", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If Language Match", pos: "b", h: 48 }
n7@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If is not Remote", pos: "b", h: 48 }
n9["<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 Commute Time"]
n10@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Is Commute Acceptable", pos: "b", h: 48 }
n11@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Deep Analysis", pos: "b", h: 48 }
n12@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser Dee..", 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/supabase.svg' width='40' height='40' /></div><br/>Save Data"]
n14@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If Has High Match Score", pos: "b", h: 48 }
n15@{ icon: "mdi:robot", form: "rounded", label: "AI Deep Analysis", pos: "b", h: 48 }
n16@{ icon: "mdi:swap-vertical", form: "rounded", label: "Items Loop", pos: "b", h: 48 }
n17["<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 a Notification"]
n18@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n19@{ icon: "mdi:play-circle", form: "rounded", label: "Manual Executing", pos: "b", h: 48 }
n20@{ icon: "mdi:cog", form: "rounded", label: "To The Next", pos: "b", h: 48 }
n0 --> n1
n13 --> n14
n16 --> n2
n16 --> n5
n20 --> n16
n7 -.-> n5
n15 --> n13
n9 --> n10
n8 --> n9
n8 --> n15
n19 --> n0
n18 --> n0
n6 --> n8
n6 --> n16
n4 --> n6
n4 --> n16
n17 --> n20
n5 --> n4
n1 --> n16
n10 --> n15
n10 --> n16
n14 --> n17
n14 --> n20
n3 -.-> n5
n11 -.-> n15
n12 -.-> n15
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 n18,n19 trigger
class n3,n5,n12,n15 ai
class n7,n11 aiModel
class n4,n6,n8,n10,n14 decision
class n1,n9 api
classDef customIcon fill:none,stroke:none
class n1,n9,n13,n17 customIcon
The Problem: Job Search Busywork Hides the Good Roles
Most job searches don’t fail because you’re unqualified. They fail because the funnel is noisy, and you burn your best energy at the top. You end up reading full descriptions just to discover the role is in German, the level is “Senior” dressed up as “Associate,” or the office is technically commutable if you enjoy losing your mornings. Then there’s the worst part: you still have to decide if you match, which usually means cross-checking your CV line-by-line while your motivation quietly leaves the room.
It adds up fast. Here’s where it breaks down in real life.
- You spend about 1–2 hours a day scanning listings, and maybe 10 minutes of that was useful.
- Hybrid and on-site roles look fine until you map the commute, which you usually do too late.
- “Requirements” are written to be vague, so you second-guess yourself and hesitate on good roles.
- You lose track of what you’ve reviewed, which leads to duplicates, missed follow-ups, and messy notes.
The Solution: An AI Filter That Only Sends High-Fit Roles
This n8n workflow acts like a personal screening assistant for LinkedIn roles. It runs on a schedule (or manually), pulls new job listings from LinkedIn via an HTTP request (using an Apify scrape behind the scenes), and then reads each full job description with AI. First, it extracts the basics that usually waste your time: language, seniority level, and whether the role is remote, hybrid, or on-site. Next, it applies your rules, so mismatches get discarded early. For the jobs that survive, it calculates commute time from your home location for hybrid/on-site roles, then does a deeper CV-to-job comparison to generate a match score and a clean summary you can act on.
The workflow starts with your keywords and preferences in one “Config” area. AI triage filters out obvious mismatches, the commute check removes “technically possible” roles, and a deeper AI pass scores fit against your CV. Finally, everything is logged, while only high-score roles trigger a Telegram alert.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you scrape 50 LinkedIn jobs each morning from 3 keywords. Manually, even a quick skim is maybe 2 minutes per job, plus another 10 minutes each for the handful you open fully, which lands around 2 hours on an average day. With this workflow, you spend about 10 minutes once setting your CV and filters, then the daily run happens in the background. You only review the 3–7 Telegram alerts that clear your match score and commute rules, which is usually 10–15 minutes total.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Apify to scrape LinkedIn job listings
- Google Cloud (Gemini + Maps) for AI reading and commute time
- Supabase to store every qualified job record
- Telegram to receive high-fit alerts
- Apify API Token (get it from your Apify account settings)
Skill level: Intermediate. You’ll paste your CV, set filters, and connect a few APIs with keys.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A scheduled run (or manual start) kicks it off. You can run it daily, twice a day, or whenever new roles tend to appear in your niche. The workflow loads your saved preferences from the setup variables node.
LinkedIn listings get collected, then handled one-by-one. An HTTP request pulls a batch of roles (via Apify), and n8n iterates through them in manageable chunks so the workflow stays stable even when you scrape more jobs.
AI triage filters out obvious mismatches. A Gemini model reads the description and extracts structured fields like language, work model, and seniority. Then a few simple checks remove anything that doesn’t match your target language and experience level.
Commute and CV fit decide what’s worth your time. If the role is hybrid or on-site, the workflow calls the Google Maps API to calculate commute duration from your home location, then drops anything over your limit. For the remaining roles, a deeper AI analysis compares job requirements to your CV text and generates a match score plus a practical summary.
Everything gets logged, and only the best roles ping you. Qualified job records are saved to Supabase for tracking. If the match score clears your threshold, you get a detailed Telegram alert and can move quickly.
You can easily modify the match score threshold to be stricter (or looser) based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Run Trigger and Manual Start Trigger
Set up the workflow entry points so you can run the job screening either on a schedule or manually for testing.
- Open Scheduled Run Trigger and set the rule interval to trigger at
9(hour) to match the configured schedule. - Keep Manual Start Trigger as-is so you can execute the workflow on demand during setup and debugging.
- Confirm both Scheduled Run Trigger and Manual Start Trigger connect to Setup Variables.
Step 2: Connect LinkedIn Listings
Define your search inputs and connect the Apify-based LinkedIn data source.
- In Setup Variables, set MyCV to
YOUR FULL TEXT CV HERE!. - Set JobKeywords to
AI Integration, ExperienceLevel tomid_senior, and JobsToScrape to20. - Set HomeLocation to
Breda, Netherlands, MaxCommuteMinutes to75, and TargetLanguage toEnglish. - Set Under10Applicants to
falseand ActorId to[YOUR_ID]. - In Fetch LinkedIn Listings, set URL to
=https://api.apify.com/v2/acts/{{ $json.ActorId }}/run-sync-get-dataset-itemsand Method toPOST. - Set JSON Body to
={"date_posted":"day","experienceLevel": {{ $json.ExperienceLevel.toJsonString() }},"keywords": {{ $json.JobKeywords.toJsonString() }},"limit": {{ $json.JobsToScrape }},"under_10_applicants": {{ $json.Under10Applicants.toJsonString() }},"sort":"relevant","location":"91000000","page_number": 1}. - Credential Required: Connect your
httpBearerAuthcredentials in Fetch LinkedIn Listings.
[YOUR_ID] in Setup Variables before testing, or the Apify request in Fetch LinkedIn Listings will fail.
Step 3: Set Up AI Screening and Filters
Configure the loop over listings, AI language checks, and filtering logic before deep resume matching.
- Ensure Fetch LinkedIn Listings connects to Iterate Listings to loop over each job.
- In Analyze Job Details, keep the prompt text as-is and confirm hasOutputParser is enabled.
- Structured Parser is connected as the output parser for Analyze Job Details — ensure credentials are added to Gemini Chat Model (not the parser).
- Credential Required: Connect your
googlePalmApicredentials in Gemini Chat Model. - In Seniority Check, confirm the condition uses
={{ $json.output.confirmed_seniority }}equals={{ $('Setup Variables').item.json.ExperienceLevel }}. - In Language Filter, confirm the boolean expression uses
={{ $('Setup Variables').item.json.TargetLanguage.toLowerCase().split(', ').includes($('Analyze Job Details').item.json.output.jobLanguage.toLowerCase()) }}. - In Remote Status Check, confirm the condition checks
={{ $('Iterate Listings').first().json.work_type.toLowerCase() }}not equalsremote. - In Retrieve Commute Duration, set URL to
=https://maps.googleapis.com/maps/api/directions/jsonand query parameters: origin={{ $('Setup Variables').item.json.HomeLocation }}, destination={{ $('Iterate Listings').first().json.location }}. - Credential Required: Connect your
httpQueryAuthcredentials in Retrieve Commute Duration. - In Commute Threshold Check, verify
={{ $json.routes[0].legs[0].duration.value }}is less than or equal to={{ $('Setup Variables').item.json.MaxCommuteMinutes * 60 }}. - Confirm the loop back via Next Item Hop → Iterate Listings to continue processing remaining jobs.
Step 4: Configure Output and Notifications
Set up deep resume matching, store results, and notify when a high-match job is found.
- In Resume Match Analysis, keep the prompt text and system message as-is and ensure hasOutputParser is enabled.
- Deep Output Parser is connected as the output parser for Resume Match Analysis — ensure credentials are added to Gemini Deep Model (not the parser).
- Credential Required: Connect your
googlePalmApicredentials in Gemini Deep Model. - In Store Records, set Table to
job_trackerand keep field mappings such as jobTitle={{ $('Iterate Listings').first().json.job_title }}and matchScore={{ $json.output.match_score }}. - Credential Required: Connect your
supabaseApicredentials in Store Records. - In High Score Gate, confirm the condition is
={{ $('Resume Match Analysis').item.json.output.match_score }}greater than or equal to8. - In Send Telegram Alert, set Chat ID to
[YOUR_ID]and keep the HTML-formatted Text expression as provided. - Credential Required: Connect your
telegramApicredentials in Send Telegram Alert.
[YOUR_ID] in Send Telegram Alert or messages will not deliver.
Step 5: Test and Activate Your Workflow
Validate each stage and then enable scheduled execution.
- Click Execute Workflow and use Manual Start Trigger to run a test cycle.
- Verify jobs are fetched in Fetch LinkedIn Listings and looped by Iterate Listings.
- Confirm AI outputs appear in Analyze Job Details and Resume Match Analysis, and that Store Records writes to the
job_trackertable. - Check that Send Telegram Alert posts only when High Score Gate passes.
- When satisfied, activate the workflow so Scheduled Run Trigger runs automatically.
Common Gotchas
- Google Cloud credentials can expire or be missing API access. If commute checks fail, look in your Google Cloud Console to confirm the Maps API is enabled and billing is active.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Apify runs can silently return fewer results if your actor settings, token permissions, or LinkedIn scraping limits change. Check the Apify run logs first before blaming n8n.
Frequently Asked Questions
About 45 minutes if you already have the API keys.
No. You’ll connect services, paste keys, and adjust plain-English settings in the Config node.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Google Cloud usage for Gemini and Maps, plus Apify runs and your Supabase plan.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, but plan to swap the data source. Replace the “Fetch LinkedIn Listings” HTTP Request step with a different Apify actor, an RSS feed reader, or another job-board API, then keep the same AI triage and scoring steps. Common customizations include changing the keyword list, tightening the commute limit, and raising the match-score gate so you only see near-perfect fits.
Most of the time it’s the bot token or chat ID being wrong, or the bot not being added to the target channel. Regenerate the Telegram Bot Token if needed, then confirm the chat ID matches the exact destination where you expect alerts. Also check if your Telegram node is pointed at the right credential in n8n. If your workflow runs but sends nothing, make sure jobs are actually passing the High Score Gate.
Practically, it depends on your scrape size and API limits. On n8n Cloud Starter you can run a healthy number of executions per month for a personal search, and Pro handles more volume. If you self-host, there’s no hard execution cap, but your server resources and the Apify/Google rate limits become the bottleneck. For most personal setups, scraping 50–200 jobs per run is comfortable.
Often, yes. This workflow uses multiple decision points (language, seniority, remote status, commute, match score) and it loops through batches, which is where n8n tends to be more flexible and cost-effective. Self-hosting is also a big deal if you want to run frequent scans without worrying about task pricing. Zapier or Make can be fine for a simple “new item → send message” setup, but they get awkward when you add deep AI analysis and filtering logic. Talk to an automation expert if you want help choosing.
Once this is running, your “job search time” stops being endless scrolling and starts being quick decisions. Honestly, that’s the whole win.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.