All playbooks

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)
<!-- INSERT IMAGE: ARCHITECTURE DIAGRAM — Pipeline flow: CRM → Match → Detect → Enrich → Outreach (see prompts/job-change-detection-visuals.md #1) -->

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:

DayPurposeTone
Day 1Congrats + reconnectNo pitch. Pure relationship.
Day 3Share something usefulArticle, insight, or intro offer. Still no pitch.
Day 7Light mention of past helpOffer 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

ToolPurposePricing
Bright DataLinkedIn profile validation~$0.01/profile
Better ContactEmail enrichment (B2B work emails)Pay-per-result
LeadsMagicPhone enrichment (personal mobiles)Pay-per-result
ApifyLinkedIn search (alternative to Bright Data)$5-10/mo
SQLiteState tracking + checkpointsFree

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)

ItemCost
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

PlanAnnual Cost
Starter~$20,000/year
Growth~$30,000/year
Enterprise$50,000+/year

Production Results

MetricValue
Contacts processed4,932 of 6,487 (76%)
Job changers detected934
Emails enriched519
Phones enriched372
LinkedIn profiles validated3,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.

Book a 30-minute scoping call →

Want this built for you?

I build production versions of these systems for a flat fee. 30-minute call, build spec included.

Book a discovery call