Click the link in the email to complete sign-in. It will open in a new tab — you can close this one.
PrecisionSearch
Welcome — Set Your Password
Setting up
PrecisionSearch
⚠ Supabase disconnected — changes are saving to your browser only and may be lost.
Candidates
Sorted by priority ↑
Select a contact to view outreach history
Candidate Pipeline
Drag cards between stages
🤖 Collect JD with AI
Simple job pages fill instantly. Some job boards and LinkedIn (JS-rendered, login-walled) get queued — tell Claude "run the AI task queue" and it'll open the page in your Chrome session and pull the JD.
Select a job to view details
Select a company
Select a partner
Name
Type
State
Title
Company
Stage
Touches
Last Activity
Added
Actions
Partner Network
Coming soon.
Marketplace
Coming soon.
Off Platform
Coming soon.
Select a record to work it
Grade candidates against job requirements using the A+ – F scale
Active Jobs
Select a job to grade candidates
Candidates
Select a candidate to see how they grade against active jobs
Jobs
Select a job to rank candidates by keyword match
AND · OR · NOT · "exact phrase" · ( grouping ) — adjacent words are AND by default. Known aliases (SDR/BDR, AE, CRO, GTM, SaaS…) expand automatically.
Candidates
◀
Select a candidate to see their keyword grade against every active job
Groups
Where every raw candidate, client and job prospect is viewed and filtered, and where groups
are built from them for enrolment into campaigns.
Not built yet (#853). This one is not UI-only: there is no prospects table
today, and nothing currently records when someone entered the prospecting pipeline or which
list-building run produced them. Those need a real data model before this screen is worth
building on top of it.
Loading…
Loading…
Campaigns
Where you build and edit outreach campaigns — the canvas, the step inspector, and
the draft → validate → active publish flow.
The engine underneath is already built and running: per-step gates, do-not-contact,
daily and weekly send caps, the schedule window, and the rule that stops a campaign the
moment someone replies. What is missing is this screen. Until it exists, a campaign can
only be authored by hand in SQL. Canvas rendering is S7.9.2, the step inspector S7.9.4,
publishing S7.9.6.
Jobs
Loading…
Templates
Reusable campaign starting points. Save any campaign as a template, then create a new
campaign from one whenever you need the same shape again.
Loading…
Responses
Replies across every channel in one place, in the shape of the existing Inbox. Built in
S7.8.2; it lives here as a peer tab rather than as a separate screen nobody finds.
Today
Actions due today
Loading…
📞 Make Calls
📞 Softphone
📱
Set up in-browser calling
Enter your RingCentral Embeddable Client ID to enable browser calling — no desktop app needed.
How to get your Client ID ↗
📋
Select a group to load your call queue
Contacts in the group will appear here in priority order
Call Queue
—
📞 Phone Numbers
Last Activity
—
Call Outcome
Notes from this call
Tasks
Contact:
Status:
Loading…
💬
Select a conversation
Choose a thread from the left to view messages
–
Outbound Activity
Inbound Activity
Outcomes
Candidate Pipeline
Candidate Conversion Funnel
Outbound Breakdown
Pipeline Stage Breakdown
Book of Business Conversion
Delete Folder
Loading…
Contacts in the Delete folder are permanently deleted after 30 days. Purge runs every Sunday at 3am UTC.
Grade Candidate —
Comp marker
Add Contact
Log Activity —
⚠ Daily limit reached for this activity type
Outcome: change
Select Outcome
Account Settings
Choose how the CRM looks. Auto switches automatically based on the time of day (dark 7pm–7am on this device).
LinkedIn recommends staying well under these to avoid restrictions. Limits reset at midnight.
All automated sending is stopped.
Campaigns stay exactly where they are. Nothing is paused or cancelled — sending simply does not happen until you switch this back on.
Stops every automated send across the whole account — LinkedIn and email, all campaigns at once.
It does not block you sending something by hand from Engage, or dialling and texting a prospect yourself;
this switch stops the machine acting on its own, not you.
Enforced in the database, at the point every automated send has to pass through — so it holds even if a page is left open,
a scheduled run fires, or something calls the system directly. Turning it back off resumes exactly where things were:
nothing is paused, so there is nothing to un-pause.
Records how each of your LinkedIn posts is performing — views, reactions, comments and
reposts — once a day, so performance can be trended over time (feeds the content graph).
It runs on the server: your computer does not need to be on.
A small daily variation means the pull does not happen at the same instant every day.
Pick an hour when your other LinkedIn automation is not running — early morning works
well, since connection campaigns run later in the day.
Save
Reusable message copy for LinkedIn connection notes, LinkedIn messages, InMail, email, and SMS. Select one when authoring any campaign module that sends a message. LinkedIn message and InMail templates can also carry one file attachment or recorded video, sent every time the template is used. (LinkedIn connection requests cannot carry a file or video -- their API accepts a text note only.)
No attachment.
Loading…
Connect enrichment APIs to automatically find emails and direct phone numbers. API keys are stored locally in your browser only.
📧 Outlook / Microsoft 365
Checking…
When connected, email history syncs automatically every 10 minutes and on app open.
Controls what is actually pulled into the CRM, not just what is displayed — anything outside this scope is never fetched and never stored, so it survives a full Re-sync All. Sent is always included: your replies live only in Sent, so without it every conversation would show just the other person's side. Deleted Items, Junk, Drafts, Outbox and Conversation History are never synced in any mode.
Available when the setting above is Inbox + Sent + Select Folders. Only ticked folders are pulled in — unticked ones are never fetched and never stored. Folders created in Outlook later start off, so a new folder never quietly starts filling the CRM. Messages already synced from a folder you untick stay where they are.
Off by default. When on, deletes messages older than the chosen age only from auto-created unknown senders — never from a candidate or client, and never from a conversation you replied to. Removal is permanent in the CRM, but your Outlook mailbox is never touched, so the original mail always remains there. Runs after a sync while the CRM is open, and reports what it removed.
📅 Microsoft Calendar
Checking…
Read-only for now — connecting proves access, nothing is synced into the CRM yet.
☁ Supabase Sync
● Connected — syncing in real-time
All changes sync to Supabase automatically. Connection is always on.
📁 Local Backup (optional)
Optionally mirror data to a local folder or Google Drive Desktop as a secondary backup.
No folder connected
Connect Claude AI to auto-parse job descriptions from pasted text or any URL. Your API key is stored locally in your browser only. Get a free key at console.anthropic.com.
Maintenance
#342, 2026-08-09 -- every keyword grade computed before today predates #337/#340/#343's scoring fixes (numeric-requirement arithmetic, unclassified-requirement handling, over-qualified counted as met). One-time re-run against the current logic, no AI cost -- keyword grading is free.
#345, 2026-08-09 -- read-only check of how many call-transcript rows have parseable per-turn speaker labels (feeding AI grading's attribution tags) vs. don't, by name, so a growing unattributed count is never silent.
#347, 2026-08-09 -- read-only check of how many candidate titles resolve to a seniority rank vs. don't, aggregated by frequency, so _CF_SENIORITY can be extended against real, observed gaps instead of guessed at.
📞
RingCentral Integration
Sync call logs, SMS, and recordings to contact timelines.
Not Connected
Click below to authorize with your RingCentral account. You'll be redirected to RingCentral's login page and returned here automatically.
🟢 Connected — calls and SMS route to contacts automatically.
Off by default. When on, deletes calls and SMS older than the chosen age only from auto-created unknown numbers — never from a candidate or client, and never from a conversation you replied to. Removal is permanent in the CRM, but your RingCentral history is never touched. Runs after a sync while the CRM is open, and reports what it removed.
LinkedIn and email channel status. Read-only — credentials are held server-side.
Checking…
Loading unprocessed events…
Loading weekly invitation budget…
The access token is stored as a Supabase Edge Function secret and is never sent to this browser. To rotate it, replace UNIPILE_API_KEY in Supabase → Edge Functions → Secrets on both projects.
🛡️
LinkedIn Inbound Review
People who messaged you on LinkedIn but are not in the CRM. Nothing here has been added to your contacts — that only happens when you choose it.
Loading…
Not junk adds the person to your contacts and brings their messages with them.
Personal means a friend or family member — future messages from them are skipped silently and never queued again.
Junk and Reviewed both clear the row without deleting anything, so this queue stays auditable.
Block is the only one that is hard to undo, so it asks first.
A public link showing only de-identified, aggregated counts (no candidate/client names or any raw records) as charts -- safe to share with anyone, e.g. your recruiting coach. Nothing on this page requires login, and it never queries your live contact data directly -- it only reads the snapshot below, which refreshes itself automatically every 30 minutes while the CRM is open in a browser tab, or you can refresh it manually below anytime.
Never refreshed yet.
Auto-refreshes every 30 minutes while the CRM is open. Only stays current if someone has it open in a tab -- click the button above for an immediate update.
This link lives at a path on your existing CRM domain, not a separate subdomain -- a true subdomain (e.g. dashboard.goprecisionsearch.com) would need DNS + Netlify custom-domain setup done on your end first; this ships today without needing any of that, and a subdomain can be layered on top later if you still want one.
Passcode
Anyone with the link above needs this passcode to view the dashboard. Checking...
Add User
Enter an email address below and we'll send that person an invite to set up their own account. Only the exact address you enter can complete it — nobody else can sign up, even if they get hold of the link. Everyone on the team sees all contacts, jobs, companies, partners, and groups — role only controls who can invite new people and who can delete a record someone else added (you can always delete your own; admins can delete anyone's).
Current Users
Loading…
Profile
No photo
PNG/JPEG/WebP, up to 5MB. Shown only here for now.
Also used as the sender name on your outbound SMS.
Your login email. Changing this isn't wired up yet -- let us know if you need it.
⬆ Import Contacts from CSV
Required columns:name or first_name + last_name Optional:classification (e.g. potential-candidate) or legacy type (candidate/client/partner/vendor), title, company, linkedin, email, phone, notes
First row must be column headers. Duplicates (same name + company) will be skipped.
Applied to every row that doesn't carry its own classification or type column.
Intent is captured here, at the point of decision — it cannot be recovered afterwards.