ATS duplicate checker while sourcing on LinkedIn

B2BChrome extension1 weekChrome extensionNext.js APIPostgres

The idea

In a recruitment agency, two recruiters messaging the same candidate about the same role looks amateurish, burns candidate goodwill, and starts commission arguments about who owns the record. The information exists in the ATS; nobody checks it while sourcing on LinkedIn because tabbing over to search each name kills the flow.

The wedge is putting the answer where the recruiter’s eyes already are: a badge on the LinkedIn profile itself saying this person is in your ATS, last touched in March, owned by Dan. Building against one well-documented mid-market ATS (Loxo) rather than all of them keeps this a one-week build and makes the integration deep instead of shallow.

Who pays

The buyer is the agency owner or ops lead at a 3-30 seat recruitment agency, at 25 USD per seat per month with a 3-seat minimum - agencies already stack small per-seat tools and this one prevents visible embarrassment in front of candidates and clients. Distribution: the Loxo customer community first (their marketplace and user groups), then recruiting ops communities and LinkedIn itself, where recruiters live.

MVP scope

  • Loxo API sync of candidate records into a matchable index
  • Content-script badge on LinkedIn profiles: known / probable / not in ATS
  • Last-touched date, record owner, and click-through to the ATS record
  • Fuzzy name-plus-company matching with LinkedIn URL exact matching on top
  • Team dashboard for ATS connection, sync status, and seats
  • Skip for v1: additional ATS integrations, in-extension note-taking, outreach features, search-results bulk overlays beyond the basic badge
// Build prompt — paste into Cursor / Claude Code / Lovable / Bolt
Build AlreadyKnown, a Chrome extension that tells agency recruiters, while
they browse LinkedIn, whether a candidate is already in their ATS. Stack: a
Manifest V3 Chrome extension (content script + service worker), a Next.js
API backend, Postgres via Prisma. Start with exactly one ATS integration -
Loxo's API - rather than attempting broad coverage.

Sync flow: an agency admin connects their Loxo account via API key from the
web dashboard. The backend syncs candidate records on a schedule (name,
current company, title, LinkedIn URL where present, last activity date,
record owner) into Postgres with an agency_id, and stores normalised match
keys.

Browsing flow: the content script detects LinkedIn profile pages and
people-search results, extracts name, current company, and the profile URL
slug, and queries the API. Matching is tiered: exact LinkedIn URL match is
definitive; otherwise fuzzy name plus company match (trigram similarity)
returns a probable match. A badge overlays the profile header: green means
not in ATS, amber means probable match, red means known - showing
last-touched date and which colleague owns the record, with a click-through
link to the ATS record.

Privacy detail: send only hashed/normalised lookup keys from the extension;
never scrape or store profile data beyond the match query.

Pages (web app): connect ATS, sync status, team seat management, billing.
Pricing: 25 USD per seat per month via Stripe, minimum 3 seats, 14-day
trial.

// More B2B ideas