Import your LinkedIn connections — one-time, gets all of them
Once imported, searching your network is instant and never touches LinkedIn:
On LinkedIn: Settings → Data privacy → Get a copy of your data
Tick Connections, request the archive, then download Connections.csv
Upload it here ↓
Recent queries
Loading…
👥 People
Every person we know, in one place — their lists, campaigns, latest contact, fit and open tasks. Click a row for the full record.
✨ Auto-segment
a
Measure
What's working
Loading team data…
▦
Outreach lives on the board
The old cross-campaign Pipeline was retired — it showed the same candidates as each search's board, minus the people it lost. For one search's stages, open its board. For the picture across searches, People has a stage view.
Every sender account, today's load, which campaigns are competing for the shared pool — and the LinkedIn queue those sends ride through.
Message templates
The library — every template across searches: filter, favorite, edit. Each search's own messaging kit lives on its board, in the Messages tab. Missing fields fall back gracefully — never a raw {{token}}.
Loading…
Pick a preset, or check the message types you want:
New template
✨ Writing assistant
What do you need to say?
↩︎ Replying to a message? Paste it
You have a draft — generate will replace it.
Preview
Example (filled in)
Deliverability check
Edit the copy — checks run automatically.
Swipe Mode
Save to list:
← skip · M maybe · → save · Esc exit
Save to a role
Import candidates
Into list
Upload a CSV
— or paste rows (CSV / tab-separated, with a header row) —
Scrapes run on your LinkedIn; people already in the list are skipped. Everyone scored is added — the fit distribution grades the list.
New campaign
Outreach positioning — feeds templates + AI
Teamtailor sync — enables "Send to TT"
Follow-up
Priority
Send as
Sender rotation
Handoff to Teamtailor
New role
Positioning — campaigns inherit this
The {{like this}} tags are message-template variables: whatever you type here is substituted into outreach messages that use them.
The two or three words that name the work — outreach reads "…roles in backend / infra". Not a job title, not a seniority.
Opportunity Brief — the INTERNAL brief that names the client (not the public JD); candidate fit is scored against it, and every list under this role inherits it
The clock the bonus matrix decays against. Leave blank to use the day the role was created here.
Outreach defaults — new campaigns for this role start from these
Teamtailor handoff column — where an Interested candidate lands in TT
Pick a Teamtailor job above to choose the entry stage
Suggested from Teamtailor — change if wrong
Pipeline tracking — map TT stages to hiring milestones
Pick a Teamtailor job above to configure pipeline stages
Suggested from Teamtailor — change if wrong
Teamtailor data — pull, don't push: nothing above is changed
Sourcing funnel — how many sourced candidates actually entered the Teamtailor process
Start sourcing for…
Open searches in the client portal that nobody here has started yet. Picking one creates the role already linked — client, engagement and the AM's direction come with it.
Loading the portal's open roles…
Add candidate manually
Start outreach
Enrollment review
Declined this role
Why did they decline? (optional — helps improve future searches)
Settings
👤
✳
Connect your AI assistant
Let your own assistant read your pending funnel and record what you did on LinkedIn — with your token, your permissions.
Every sender account, today's load, and which campaigns are competing for the shared pool.
✍
Message templates
The library — every template across searches, the shared snippets, plays and the starter pack. Each search's own kit lives on its board's Messages tab.
You're signed in as a regular user. Ask your admin to promote you if you need to manage the index or invite teammates.
AI Provider
API Keys
Claude API
Teamtailor
ContactOut
🔒 Keys are managed in your Render environment variables, not stored here.
Outreach voice
The playbook the AI follows when drafting outreach — voice, what to emphasize, phrases to avoid, low-pressure closers. Edit to tune your voice.
Home screen links
The links everyone sees on their Home screen under Your kit — your Notion SOPs, the screening rubric, anything the team keeps asking a human for. Paste the full link (it has to start with https://). Leave a link empty and that row shows as “not set yet” instead of sending anyone to a dead page. Use ↑ ↓ to order them: the ones above the line show on Home without anyone clicking, and the rest fold behind “more”.
Loading…
Extension download location
Where “⬇ Get the current build” on Home sends people — the Drive folder with the extension builds. Leave it empty and the button serves a zip built from this deploy instead.
Claude plugin repo
The atomic-sourcing plugin repo linked from the AI toolkit block on Home. These are Claude skills, so this one keeps its name. Leave it empty and that row shows as “not set up yet”.
Admin screens
Three full screens that live outside the app shell. They use your session here — no second login.
Locked bands is the correction loop for the bonus: a band is stamped once and never edited, so putting one right is two recorded acts — void, then re-stamp on the real day. Search start dates is where the clock those bands are measured against gets its anchor — a date nobody has set falls back to the day the role was typed in, which is a filing artifact, not a fact about the search. Switches answers “which of the things we built are actually running”.
Portal bridge — what it actually sends
The search start date, the agreed salary, the fee terms and the seat count all live in the client portal. This reads the raw bridge payload and says, per field, whether the portal isn't sending it or we aren't reading it.
Machine-filed task backlog
Rows the system filed for itself and then stopped closing — the browser extension's invite mirrors and the warm-up nudges. They are not anybody's work, and Home already leaves them out of its count.
A dry run first, always: nothing can be closed until you have seen the count and the breakdown. Closing writes status='skipped' and a reason stamp and nothing else — no sequence is advanced, no message is sent, nobody is contacted. Real work (failed sends, failed Teamtailor pushes, collisions, expired invites) is excluded twice over and its counts are shown unchanged on both sides. Each row is reversible one at a time: reopen it from the object it is about — the outreach, the candidate, or the person.
Attribution check — injected rows
Not checked yet.
Injected and imported candidates are saved by whoever ran the import, so the board credits them, not the person who actually found the candidate. Nothing here is changed automatically — open the candidate on the board and use sourced by … ✎ to correct one.
Ratio windows — model the two rules
Not modelled yet.
Each surviving hire closes an accounting window. This shows what each window's ratio would be under both candidate-assignment rules — by call date (which agrees with the bonus clock) or by sourced date — and names the candidates the two rules disagree about. Changes nothing.
Bonus ceiling — what would change
Not checked yet.
Changes nothing — this only shows what a different ceiling would produce. A change to the default reaches only the people who have no ceiling of their own, and it reprices placements already earned, because the delivery stamp locks the matrix row rather than the rate.
Screened Candidates
Loading…
Sync new adds candidates screened since last index. Full rebuild re-fetches everything (~15 min).
Talent Pool
Loading…
candidates
Continue resumes indexing from where the last run stopped (safe to click many times — your DB has ~35k candidates total).
Sync newest only catches brand-new arrivals (fast).
Full rebuild starts over from page 1.
Auto-continue re-fires Continue every 2 min when paused, until the full pool is indexed.
Teamtailor progress sync
Pulls each handed-off candidate's current Teamtailor stage back onto the board. Read-only — never writes to Teamtailor.
Runs the back-sync across every role with a configured pipeline map, synchronously. The background daemon stays OFF until TT_BACKSYNC_SECONDS is set.
Submitted-to-client sync
A candidate published to the client on the portal is submitted. This pulls that list and stamps the matching people here — powering the Submitted funnel bucket and sourcer earnings.
Matching is exact or nothing — email, then LinkedIn, then Teamtailor id. Anyone ambiguous is skipped and listed, never guessed. Inbound applicants (nobody on our side sourced them) are skipped by design. Safe to re-run. The background daemon stays OFF until PORTAL_SUBMITTED_SYNC_SECONDS is set.
Portal role links
Portal roles with no sourcing role behind them can never receive a submitted stamp — every sourcer on them reads as 0. Review the proposed links here.
“Confident” means the titles essentially agree, the client agrees, and nothing else is close — only those are linked automatically. Ambiguous pairs and portal roles with no counterpart here are listed for you to settle; each links with one click and is reversible.
Invite a teammate
Share this link with your teammate:
Loading team…
Activity log
Who created, deleted, or sent things — most recent first.
Loading…
AI token usage — last 24h
Every AI call (scoring, search, drafts) logged per person — tokens are what the bill is made of. Background jobs show as (background). Logging starts from today; older spend wasn't recorded.
Loading…
Email (Google Workspace)
Send outreach emails from your Gmail account. Click the button below — Google will ask you to sign in and approve access.
How does this work?
Setup: Click "Connect Google Workspace" → sign in with your Google account → approve the permissions. That's it — takes 30 seconds. How often: You only do this once. The connection stays active permanently (we use a refresh token). You won't need to reconnect unless you revoke access from your Google account settings. What it does: Sends emails from your real inbox. Replies arrive in your Gmail as normal and also show up in the atomic*HR Inbox. Safety: New mailboxes send live, but a warm-up ramp + conservative daily caps keep volume low at first and increase it gradually. Pause a mailbox anytime to stop sending.
Loading…
LinkedIn
use with care
Send LinkedIn connection requests, messages, and InMails through your own LinkedIn account. Each person runs a small server on their computer that controls a headless browser logged into LinkedIn.
How does this work?
Setup (one time): Your admin sends you an onboarding bundle (a folder with your setup). Run its setup.sh (or paste the Claude Code prompt from the bundle). It installs a small LinkedIn server + your permanent tunnel, you log into LinkedIn once in the browser, and it sets everything to auto-start. Daily use: Nothing — the LinkedIn server + tunnel run automatically in the background and restart on reboot. Just keep your computer awake while you work. How often do I need to log in again? The LinkedIn session lasts several months. You'll only re-login if LinkedIn asks for verification (rare) — re-run uvx mcp-server-linkedin@latest --login. Safety: New accounts send live with conservative daily limits that warm up gradually. Replies land in your unified Inbox. ⚠️ Risk: This uses LinkedIn's private API. While designed to look like normal browsing, heavy use can trigger LinkedIn's automation detection. Start slow.
Loading…
Connect a LinkedIn account
Connect via the MCP session (recommended)
Each LinkedIn account runs through its own MCP session — the app sends as
whoever is logged in there. Connecting your account on this machine? Leave the
link empty. Connecting a teammate's account? Paste their MCP link below.
New accounts send live with conservative warm-up caps.
📋 How to set up LinkedIn sending (5 min, one time)
Option A — Paste in Claude Code
easiest
If you have Claude Code installed, open it and paste this prompt (you'll need the bundle folder your admin sent):
I'm setting up atomic*HR LinkedIn outreach on this computer. My admin sent me a setup bundle folder (it has a .json, a config.yml, a setup.sh, and a README). It's here:
Please:
1. Detect my OS. Read config.yml, get the hostname, tell me my URL https:///mcp.
2. Install missing tools: Homebrew / my package manager, then uv (astral.sh/uv) and cloudflared.
3. From my bundle: copy the .json into ~/.cloudflared/, write ~/.cloudflared/config.yml (replace __HOME__ with my home dir), run "uvx mcp-server-linkedin@latest --login" and pause for me to log into LinkedIn, then make the MCP (127.0.0.1:8377) and "cloudflared tunnel run" auto-start across reboots (launchd on macOS / Task Scheduler on Windows / systemd on Linux).
4. Verify: curl my https:///mcp and confirm HTTP 406.
5. Then tell me to: paste my URL under Settings → Accounts → Connect LinkedIn (MCP); connect Gmail; and load the linkedin-extension folder via chrome://extensions (Developer mode → Load unpacked).
Keep my computer awake for sending; don't bulk-read my inbox or mass-send (LinkedIn rate limits).
Don't have a bundle yet? Ask your admin to run ./provision-teammate.sh <yourname> and send you the folder. You just log into LinkedIn when the browser opens.
Copy the https://….trycloudflare.com link and paste it in the MCP link field above.
How often? Setup is once. LinkedIn login lasts months. Daily: just run the script or paste the "start" part in Claude Code — takes 10 seconds. Close Terminal to stop.
Advanced — connect with a session cookie instead
Only if you're not using the MCP. Stored encrypted. ⚠️ Automating LinkedIn can violate its terms.
Grab li_at + JSESSIONID from your browser (F12 → Application → Cookies → linkedin.com).
Domain authentication (SPF · DKIM · DMARC)
Authenticated domains land in the inbox, not spam. Your sending domains are listed
below — re-check after you add DNS records. A mailbox marked dedicated is
blocked from live sending until its domain passes; the company's shared domain only warns.
Loading…
Sending engine
The engine sends the next due step on auto campaigns, respecting each mailbox's
caps, business hours, jitter and a compliance check before every send. In production an
external scheduler pings /cron/tick every few minutes; run a tick by hand here.
Manual steps (LinkedIn · call)
LinkedIn and call steps are surfaced as tasks for a human — no automation (LinkedIn ToS).
Do the step, then mark it done to advance the sequence.
Loading…
Reputation & alerts
The engine watches bounce/complaint signals and auto-throttles or pauses a mailbox
before it harms the domain. Simulate a spike to see it trip (testing).
Loading…
Send mode is per campaign. Auto-send ON: the engine sends due steps on schedule from your connected accounts. Manual: each step becomes a task — copy it, send, "Mark sent". Either way, a reply stops the sequence immediately.
Send modeEach scheduled message becomes a task — copy it, send, mark sent.
🎯 Segment
AI picks optimal channel order + cross-channel references.
Recycle a formula from another campaign or a saved template — tokens adapt to this role.
Loading…
Loading…
✉️ Use a template —
Renders a blueprint against this candidate (tokens filled). Campaign-level customization lives in ✉️ Messages.
Plays / archetypes
A play is the AI's instructions for an outreach approach. Edit a built-in or add your own — they show up in the Messages builder's Play picker and as template tags.
Loading…
Add a play
🎯 Segments for this role
Segments are the candidate personas the AI uses to tailor outreach. Edit fields inline and Save, add or remove individually, or regenerate from the role.