The $80 UserGems Alternative: Job Change Detection Pipeline
TLDR
An automated pipeline that monitors your CRM contacts for job changes, detects when someone lands at a new company, enriches their new contact info, and triggers re-engagement outreach. Total API cost: about $80. UserGems charges $20-30K/year for the same thing.
I was at a SaaS company — they were their own best customer, eating the dog food, as they say. 6,500 paid users sitting in the CRM. Sales wanted to know when contacts changed jobs. UserGems quoted $30K. I said give me a weekend. Built the whole thing for $80 in API costs. Detected 934 job changers. Enriched 519 new emails and 372 phone numbers. That "old champion, new budget" motion is the highest-converting outbound play in B2B — and you don't need enterprise software to run it.
What you get:
- Automated detection of job changers across your entire CRM
- New email + phone enrichment at their new company
- Personalized re-engagement sequences referencing your past relationship
- 3-5x higher reply rates vs. cold outbound (warm relationship + new budget)
Want this built for your CRM? I build production versions of this pipeline — calibrated thresholds, enrichment waterfall, CRM integration — for a flat fee. Book a 30-minute scoping call to get a build spec. Or keep reading for the full breakdown.
Step 0: Who to Monitor
Not all CRM contacts are worth tracking. Before you build anything, decide who matters.
Filter for high-value contacts:
- Closed-won champions — people who bought from you before
- Power users — high product engagement scores
- Senior decision-makers — VP+ titles with budget authority
- Churned account contacts with high NPS — they liked the product, the timing was wrong
What counts as a "change":
- Changed companies — different employer on LinkedIn vs. your CRM (the money signal)
- Promoted — same company, different title (worth a congrats email)
- Left workforce — no current position listed (skip these)
- Side venture — multiple current positions (flag for manual review)
When I ran this on 6,500 contacts, roughly 15% had changed jobs in the past 12 months. That's 900+ warm re-engagement opportunities sitting in a CRM nobody was monitoring.
<!-- INSERT IMAGE: BEFORE/AFTER — Manual CRM review (slow, spreadsheet) vs. automated pipeline (fast, comprehensive) (see prompts/job-change-detection-visuals.md #5) -->Step 1: CRM Export
Pull your contacts into a flat format the pipeline can process. Most sales teams already live in Google Sheets, so that's a natural intermediary — but any data store works.
Fields you need:
contact_fields:
required:
- first_name
- last_name
- email # unique key for dedup
- company
- title
highly_recommended:
- linkedin_url # critical for Step 2
optional:
- phone
- last_activity_date
- deal_stage
Dedup before processing. CRMs are messy. Use email as the unique key. Duplicates waste API calls downstream — I burned $12 on redundant LinkedIn lookups before adding a dedup step.
Skip generic accounts. Filter out team@, support@, info@, hello@, admin@ — shared mailboxes don't change jobs. Pull in batches of 500 to stay within API rate limits.
Step 2: LinkedIn Matching
For each contact, validate their LinkedIn profile and pull their current employment. You're comparing what your CRM says against what LinkedIn says — that's where detection happens.
Agent prompt for the matching task:
You are a LinkedIn profile matching agent.
INPUT: A batch of contacts with name, email, company, title, and LinkedIn URL.
TASK:
1. For contacts WITH a LinkedIn URL: validate the profile and extract current employer + current title.
2. For contacts WITHOUT a LinkedIn URL: search LinkedIn using first name + last name + company to find the most likely match.
3. Return structured data: contact_email, linkedin_url, current_company, current_title, match_confidence (0-1).
MATCHING RULES:
- If multiple profiles match a name + company combo, prefer the one with the most connections.
- If no match found, return match_confidence: 0.
- Flag profiles with multiple current positions as "side_venture."
OUTPUT: JSON array of matched profiles.
Tool options: Bright Data's LinkedIn dataset API handles batch lookups well — submit 20 URLs at a time, poll every 45 seconds for results. Apify's LinkedIn search actor is a good alternative, especially if you're matching by name instead of URL. Budget roughly $0.01 per profile lookup.
When I ran this on 4,932 contacts (after dedup), 3,419 LinkedIn profiles came back validated. The rest were either stale URLs or contacts who'd gone dark on LinkedIn entirely.
Step 3: Change Detection
The core of the system. Compare LinkedIn's current data against your CRM records. The tricky part: company names are messy.
Fuzzy matching rules (pseudocode):
NORMALIZE company name:
→ lowercase
→ strip suffixes: Inc, LLC, Ltd, Corp, GmbH, Technologies, Solutions, Holdings, (anything in parens)
→ collapse extra whitespace
CHECK known aliases:
Google ↔ Alphabet ↔ Google Cloud
Facebook ↔ Meta ↔ Meta Platforms
Twitter ↔ X ↔ X Corp
Amazon ↔ AWS ↔ Amazon Web Services
Microsoft ↔ LinkedIn ↔ GitHub
COMPARE normalized names:
IF exact match → same company
IF one contains the other → same company (catches "Acme" vs "Acme Software Inc")
IF alias match → same company
IF fuzzy similarity ≥ 0.85 → same company
ELSE → different company
CLASSIFY:
same company + different title → PROMOTED
same company + same title → SAME_ROLE (skip)
different company → CHANGED_COMPANIES (the money signal)
no current company → LEFT_WORKFORCE (skip)
The 0.85 threshold is calibrated. I tested from 0.70 to 0.95 on real CRM data. Below 0.85, you get false positives — "Acme Analytics" matching "Acme Consulting." Above 0.90, you miss valid matches — "Salesforce" vs "Salesforce.com." When I ran this, the 0.85 threshold caught 934 job changers out of 3,419 validated profiles.
<!-- INSERT IMAGE: CHANGE CLASSIFICATION DECISION TREE — Same company? → Promoted/Same Role. Different? → Changed companies. No company? → Left workforce. (see prompts/job-change-detection-visuals.md #3) -->State tracking: Store results in SQLite so you can run the pipeline repeatedly and only flag new changes. Checkpoint after every batch — when you're processing thousands of contacts over hours, a crash without checkpoints means starting over.
The alias table is your secret weapon. Most fuzzy matching systems miss subsidiary relationships entirely. Someone moves from "Google Cloud" to "Alphabet" and gets flagged as a job changer — they didn't go anywhere. Maintaining a living alias table prevents these false positives and saves you from embarrassing re-engagement emails to people who are still at the same company.
Step 4: Enrichment Waterfall
Someone changed companies. You need their new contact info. No single enrichment API has great coverage alone — run two in sequence.
ENRICHMENT FLOW:
For each job changer:
EMAIL:
1. Try Better Contact (strongest for B2B work emails)
→ if found: save email, source = "better_contact"
→ if miss: continue
2. Try LeadsMagic (fallback)
→ if found: save email, source = "leadsmagic"
→ if miss: flag for manual lookup
PHONE:
1. Try LeadsMagic (strongest for personal mobiles)
→ if found: save phone, source = "leadsmagic"
→ if miss: continue
2. Try Better Contact (fallback)
→ if found: save phone, source = "better_contact"
→ if miss: flag for manual lookup
Why two APIs? In the production run across 934 job changers: Better Contact found 519 emails. LeadsMagic found 372 phone numbers. Running both with fallback logic gets you ~70% coverage. One API alone caps around 60%. The extra $10-15 for the second API is worth it.
Each API has different strengths. Better Contact is built for B2B work addresses — it's great at finding someone's new corporate email. LeadsMagic pulls personal mobile numbers that Better Contact misses. The waterfall order matters.
<!-- INSERT IMAGE: ENRICHMENT WATERFALL — Primary → fallback → manual chain for both email and phone (see prompts/job-change-detection-visuals.md #2) -->Step 5: Re-engagement
These people already know you. Already trusted you enough to buy once. The outreach should read like a check-in, not a sequence.
Agent prompt for writing re-engagement emails:
You are writing a re-engagement email for someone who just changed jobs.
CONTEXT:
- Contact: {first_name} {last_name}
- Old company: {old_company} | Old title: {old_title}
- New company: {new_company} | New title: {new_title}
- Past relationship: {relationship_context}
- Your product/service: {product_description}
RULES:
- Under 100 words. This is a reconnection, not a pitch.
- Reference the specific past relationship — the project, deal, or conversation you had.
- Congratulate the move genuinely. Don't make it about you.
- One soft CTA: "Would love to catch up" or "Curious how things are going."
- NO "hope you're doing well." NO "I saw on LinkedIn that..." NO buzzwords.
- Sound like a real person checking in, not a sales bot.
Email template (Day 1):
Subject: Congrats on {new_company}
Hey {first_name},
Saw you moved to {new_company} — congrats. {Specific reference to past work together}.
Curious how the transition's going. {One relevant observation about new company}.
Would love to catch up if you have 15 minutes.
[Your name]
Sequence timing:
| Day | Purpose | Tone |
|---|---|---|
| Day 1 | Congrats + reconnect | No pitch. Pure relationship. |
| Day 3 | Share something useful | Article, insight, or intro offer. Still no pitch. |
| Day 7 | Light mention of past help | Offer to help at new company. One line about what you did before. |
The key: these are people who already know you, like you, and trusted you enough to buy from you before. The email should read like a genuine check-in, not an outbound sequence. When I sent these, the reply rate was 3-5x higher than cold. That's the "old champion, new budget" motion in action.
What the Playbook Doesn't Cover
This playbook gives you the architecture. You could build it yourself.
Here's what the playbook doesn't give you:
- Threshold calibration. The 0.85 fuzzy match threshold is the final number. Getting there took testing from 0.70 to 0.95 on real CRM data — too low catches false positives, too high misses real changes.
- Continuous monitoring. This playbook describes a one-time run. The production version runs monthly, detects new changes automatically, and triggers sequences without manual intervention.
- CRM integration. Wiring detected changes back into your CRM (HubSpot, Salesforce, Pipedrive, Odoo) with proper field mapping, dedup logic, and ownership rules.
- Alias table maintenance. M&A activity, rebrands, and subsidiary changes happen constantly. The production system has a living alias table that prevents false positives.
Most teams that attempt this spend 40-80 hours on a system that catches 60% of what the calibrated version catches. The calibration is where the value compounds.
I build production job change pipelines for $5,000-$12,000, flat fee. You own everything. Compare that to $20-30K/year for UserGems. The scoping call is free — you'll walk away with a build spec and a quote, even if you never hire me.
Currently booking for March 2026. I take on 2-3 builds per month.
Book a 30-minute scoping call →
Pro Tips & Pitfalls
Start small. Run your first batch on 100 contacts. Validate the fuzzy matching catches real changes and doesn't flag false positives before scaling to thousands.
Checkpoint everything. Save progress after every batch. A crash at contact 4,000 without checkpoints means starting over. Ask me how I know.
Watch Bright Data costs. LinkedIn lookups are the expensive part. Batch aggressively (20 URLs per request) and skip contacts with recent LinkedIn snapshots.
Don't automate outreach on day one. Review the first 50 detected changes manually. Confirm they're real. One bad detection that triggers an awkward email to a current customer undoes all the trust this system is built to create.
Dedup your CRM first. Most CRMs have duplicates. Processing the same person twice wastes API calls and risks sending double outreach.
The alias table needs maintenance. M&A activity, rebrands, and subsidiary changes happen constantly. Review your alias table monthly. When Broadcom acquired VMware, every VMware contact in the CRM would've been flagged as a job changer without the alias update.
LinkedIn URLs degrade over time. People change vanity URLs, accounts get deactivated. If more than 20% of your URLs return 404s, consider a name-based search fallback through Apify instead of skipping those contacts entirely.
Tools & Links
| Tool | Purpose | Pricing |
|---|---|---|
| Bright Data | LinkedIn profile validation | ~$0.01/profile |
| Better Contact | Email enrichment (B2B work emails) | Pay-per-result |
| LeadsMagic | Phone enrichment (personal mobiles) | Pay-per-result |
| Apify | LinkedIn search (alternative to Bright Data) | $5-10/mo |
| SQLite | State tracking + checkpoints | Free |
Alternative enrichment: Apollo, Hunter, Clearbit, ZoomInfo all work. I chose Better Contact + LeadsMagic because they had the best coverage for my data at the lowest cost. Test with 50 contacts before committing.
The Math
<!-- INSERT IMAGE: COST COMPARISON INFOGRAPHIC — $80 DIY stack vs. $30K UserGems side-by-side (see prompts/job-change-detection-visuals.md #4) -->Build Cost (One-Time)
| Item | Cost |
|---|---|
| Bright Data — LinkedIn validation (~5,000 contacts) | ~$50 |
| Better Contact — email enrichment (~900 changers) | ~$20 |
| LeadsMagic — phone enrichment (~900 changers) | ~$10 |
| Total | ~$80 |
UserGems Pricing
| Plan | Annual Cost |
|---|---|
| Starter | ~$20,000/year |
| Growth | ~$30,000/year |
| Enterprise | $50,000+/year |
Production Results
| Metric | Value |
|---|---|
| Contacts processed | 4,932 of 6,487 (76%) |
| Job changers detected | 934 |
| Emails enriched | 519 |
| Phones enriched | 372 |
| LinkedIn profiles validated | 3,419 |
| Total API cost | ~$80 |
The ROI: If 5% of those 934 job changers convert — that's 47 deals. At $10K average ACV, that's $470K in recovered pipeline. For $80 in API costs.
The math speaks for itself.
Want This Built for Your CRM?
$80 in API costs. 934 job changers detected. $470K in recovered pipeline. That's one run.
I build job change detection pipelines like this for businesses that want to stop paying $20-30K/year for UserGems and own the system outright. Here's what the scoping call covers:
- Your CRM setup — which contacts to monitor, which fields to enrich, which signals matter
- A build spec — fuzzy matching calibrated to your data, enrichment waterfall configured, CRM integration mapped
- A flat-rate quote — $5,000-$12,000 one-time. Compare that to $20-30K/year for UserGems. You own everything.
The call is 30 minutes. No pitch. If I can help, I'll tell you what it costs. If I can't, I'll tell you that too.
"Julian takes clear ideas and turns them into fully executed AI go-to-market builds — with extreme ownership and zero ego." — Hannah Recker
Currently booking for March 2026. I take on 2-3 builds per month.