Glossary
A working glossary of LeadHunter terminology. Skim it once when you’re new; refer back when a term feels overloaded or you can’t remember which field carries what.
Grouped by concept area, not alphabetised — related terms read better next to each other.
Top-level containers
Section titled “Top-level containers”- Company — Top-level tenant. Sometimes called a project internally (you may see it in older URLs). One company per business, or one per client if you’re an agency. Everything else hangs off a Company; data never crosses between companies. See Company and Product.
- Product — What you’re selling. Carries the description, ICP, default communication language, and example URLs that calibrate scoring. A Company can have multiple Products.
- User — A person with a login. One user can belong to many Companies via team memberships.
Accounts and contacts
Section titled “Accounts and contacts”- Account — An organisation in your database (a company, a venue, a podcast — anything you’d put on an org-level row). Can be a customer, prospect, partner, press contact, supplier — the same row serves all roles. See Account.
- Contact — A person inside an Account: name, email, phone, job title, seniority, LinkedIn URL. Distinct from Account; one Account can have many Contacts (or zero).
- Contact role kind — Tags how to interpret a Contact’s
seniority/department/is_decision_makerfields. The sameseniority='c_level'value reads as “C-Suite executive” for abuyer, “Editor-in-chief” for ajournalist, and “Senior career level” for acandidate. Seven kinds:buyer(default),journalist,candidate,investor,partner,influencer,other. Defaultbuyerpreserves the sales-shaped reading for existing contacts. - Lead — Historical term, still used in URLs and verb phrases (“lead generation”, “hunting leads”). The data row itself is now called Account; the discovery flow is still called lead hunting. Same thing.
- Contract end date (
contract_end_at) — Optional renewal-cycle date on Account. Drives the renewal goal: campaigns atgoal='renewal'filter for customers approaching this date. NULL for accounts not on a renewal cycle (most prospects, all press / candidates / investors).
Status, types, and channel — the three orthogonal fields
Section titled “Status, types, and channel — the three orthogonal fields”- Status (lifecycle) — Single-valued pipeline state on an Account:
prospect,contacted,in_negotiation,customer,lost,do_not_contact. Answers “where in the pipeline?” - Relationship types — Multi-select labels on an Account:
client,prospect,reseller,affiliate,supplier,partner,investor,press,influencer,analyst,competitor,candidate,personal_network. Answers “what is this account to me?” - Acquisition channel — Single-valued marketing-channel attribution:
outbound(default),adwords,meta_ads,linkedin_ads,organic_search,organic_social(Instagram DM, X, …),referral,event,partner,cold_inbound,other. Answers “how did this lead first reach me?” - Acquisition metadata — Free-form JSON bag attached to an account for channel-specific data (UTM parameters, ad campaign id, Instagram thread URL, referrer email, …).
- Status source — Audit-trail field recording how a status transition happened:
manual,campaign_outreach,import_exact,import_fuzzy,import_llm_verified,inbound_acquisition,pre_existing(operator-marked relationship that predates LeadHunter). - Status history — Append-only audit trail on each Account; every status change writes an entry with from/to/at/by/source/reason.
- Pre-existing customer — A Customer-status transition flagged as a relationship that predates LeadHunter (a renewal client, a CRM import). Still on the audit trail, but the dashboard’s Closed (won) metric skips it — so importing your existing book of business doesn’t fake a win.
- Auto-promotion — Lifecycle-status changes LeadHunter makes for you without explicit operator action. Two cases: (1) creating an account with an inbound acquisition channel starts it at
contactedinstead ofprospect; (2) logging the first outbound on aprospectadvances it tocontacted. Forward-only; never demotes.
Guardrails
Section titled “Guardrails”- DNC (
do_not_contact) — Blanket GDPR/CAN-SPAM opt-out. Sticky — survives merges, hard-blocks outbound on every campaign goal. No override flag. - Per-purpose DNC (
do_not_contact_purposes) — Newer, finer layer: a list of campaign goals the account opted out of.["sales"]means “block sales campaigns from contacting me, but research interview asks / press pitches / event invites are still OK”. Sticky like DNC, but goal-scoped. See Account → Per-purpose opt-outs. - DNC history (
dnc_history) — Audit trail of per-purpose opt-out / opt-in events:{purpose, action, at, by, source, reason}. Mirrorsstatus_historyshape. - Hard block — Outreach refused, no override available. Applies to
do_not_contactstatus, topersonal_networkrelationship type universally, and tocompetitorfor most goals (admitted in press / event / research where competitor accounts are legitimate targets). - Soft block — Outreach refused unless an explicit
include_<type>=trueflag is set. Applies tocustomerstatus (in goals that block customers) and tosupplier/investor/press/analyst/candidaterelationship types (per goal — a press campaign won’t block press accounts, etc.). - Block explanations — When bulk-add hits a guardrail, the response carries a goal-aware reason per blocked bucket: a Sales campaign tells you “this Sales campaign soft-blocks press accounts; pass
include_press=trueor switch the goal”. The frontend renders these directly under each blocked count.
Lifecycle of a row
Section titled “Lifecycle of a row”- Archive — Soft-hide a Product, Campaign, or Account from default lists while keeping every reference intact (campaign rows, scores, conversations, expenses, audit trail). Accounts also carry a free-text archive reason. Reversible at any time.
- Delete — Permanent removal, cascades to every related row. Campaigns and Accounts require typing the exact name to confirm. Products are protected if any campaign references them — archive instead.
Scoring
Section titled “Scoring”- Target persona (a.k.a. ICP / Ideal Customer Profile) — Structured description of who a campaign targets: sector, geography, firmographics, buying signals, anti-patterns. Keyed by (Product, Goal) — a sales campaign of a product carries a buyer persona, a press campaign of the same product carries a publications-and-journalists persona, etc. Each independent, each with its own approval state. AI-generated, operator-approved. The “ICP” label remains the alias in sales-shaped flows. See Target persona and scoring.
- Persona confidence — How confident the AI is in the persona draft:
low/medium/highplus a 0–100 score. Low-confidence drafts are usually a signal that the Product description is too thin and worth sharpening before approval. - Revision feedback — Free-text you provide when asking the AI to redraft the persona (“focus more on independent garages, drop the enterprise framing”). Feeds into the regeneration prompt; bumps
revision_count. - Fit score — A 0–10 rating for how well an Account matches the goal’s target persona, with a categorical label and 2–4 typed reasons. Keyed by (Product, Account, Goal) — a sales score and a press score for the same account on the same product are independent rows.
- Score label — Three values:
excellent(≥8),moderate(5–7),mismatch(<5). - Score reasons — 2–4 short, typed justifications: positive (green check, concrete persona match), negative (red X, concrete persona gap), neutral (amber, context that doesn’t push either way).
- Score distribution — The 10-bucket histogram (
0-1,1-2, …,9-10) on the campaign detail page. A healthy persona usually produces a bimodal distribution; flat or all-moderate distributions signal an under-anchored persona. - Stale-score banner — Orange banner on the campaign detail page when accounts have scores from a different goal than the campaign’s current goal. Surfaces after a goal switch (the cached scores rated against the previous rubric); one-click Rescore clears it.
- Override score — A campaign-specific manual score that supersedes the AI score for that campaign only. The (Product, Account, Goal) score row doesn’t change.
- Calibration feedback loop — Once a (Product, Goal) pair crosses ~10 reviewed accounts (approved + rejected), your recent verdicts feed back into the scoring prompt as concrete examples. Goal-scoped — approvals on the press persona don’t affect the sales persona scoring of the same product.
Campaigns and outreach
Section titled “Campaigns and outreach”- Campaign — One outbound effort against a list of Accounts, scoped to a single Product. See Campaign.
- Campaign goal — The why of outreach. Eleven values:
sales(default),partnership,press,influencer,investor,recruiting,customer_expansion,win_back,event,research,renewal. Reshapes the target persona, scoring rubric, message intent, bulk-add guardrails, and CAC label per campaign. See Outreach reasons and targets. - Goal history (
goal_history) — Audit trail of goal transitions on a Campaign:{from, to, at, by, source, reason}. Auto-appended whenever the goal changes; mirrorsAccount.status_history. The change endpoint accepts an optionalgoal_change_reasonbody field that gets stamped into the entry. - Close metric label — Goal-aware noun phrase for “what counts as a close” — drives the third CAC card on the Costs panel. Sales reads “Cost per closed-won customer”, press reads “Cost per press reply”, recruiting reads “Cost per candidate engaged”, renewal reads “Cost per renewal”.
- CampaignAccount — Join row between a campaign and an account. Carries per-campaign workflow: review status, outreach status, chosen contact, override score, tags, notes, and the role-in-campaign override.
- Role in campaign (
role_in_campaign) — Optional per-campaign lens override on a CampaignAccount. The same Account can be a paying customer AND a press contact AND a research participant; different campaigns view it through different lenses. When set, the outreach drafter receives a “Role for this campaign: treat this account as<role>regardless of its other tags” directive so the message respects the lens. - Review status — Per-campaign-per-account:
pending,approved,rejected. Drives the calibration feedback loop. - Outreach status — Per-campaign-per-account workflow:
not_started,draft,scheduled,sent,bounced,responded. - Scoring status — Per-campaign state for the background scoring job:
idle,running,completed,failed. - Bulk-add from filter — Action that pulls every account matching a saved filter into a campaign in one pass, honouring all guardrails.
- Reach estimator — Pre-flight count of how many accounts will land when you bulk-add — accounts for every guardrail so the number is what will actually be added.
- Outreach inbox — The campaign’s Outreach tab. Shows every conversation thread in the campaign sorted by what needs attention (recent inbound first, then drafts that haven’t been sent).
Conversations and messages
Section titled “Conversations and messages”LeadHunter is a communication log, not a sending engine. You send through your own channel and paste the exchange in.
- Channel — Per-message:
email,linkedin,instagram,twitter_x,whatsapp,phone_call,sms,other. What the cohort funnel attributes against later. - Direction —
outbound(you sent) orinbound(they sent). - Mode — How an outbound message was produced:
ai_draft(first outbound),ai_continue(continuation),type_translate(you wrote in your language, LeadHunter translated),log_sent(you sent it elsewhere; paste to record). Inbound is alwaysinbound_paste. original_text— The authoritative version of a message — what the account actually received (outbound) or sent (inbound), in their language.translated_text— A reader-friendly view of the same content in another language. Populated fortype_translateoutbound (the user’s draft) andinbound_paste(the translation into your reading language).- Reading language — Your User-level communication language. Inbound text is translated into it. Independent of UI language.
Costs and CAC
Section titled “Costs and CAC”- Campaign expense — A user-entered cost line item against a campaign: Adwords spend, agency fees, labor hours, software, content, events. Ten kinds. Carries amount + currency + date + vendor.
- Expense kind — One of
adwords,meta_ads,linkedin_ads,other_ads,agency,labor,software,content,event,other. - Quick-add expense — The 💸 button on every row of the campaigns list. Opens a modal pre-filled for that campaign so you can log an expense without opening the campaign first.
- Primary currency — The currency with the largest total on a campaign. Drives the headline number and the CAC math.
- CAC (Cost of Acquisition) — Total spend ÷ outcome count. LeadHunter computes three flavours: per outreached account, per responded account, per closed-won customer. Only computed when user-entered expenses share one currency.
- API costs — Auto-tracked per-call costs for LLM tokens, Google Maps lookups, Tavily searches. Recorded automatically (you don’t enter them) and surfaced alongside user-entered expenses on every campaign’s Costs panel. Always in USD. CAC is computed from the user-entered side only — see Usage and costs.
Discovery and research
Section titled “Discovery and research”- Research — A tracked discovery / enrichment activity. Imports, Google Maps searches, website scrapes, AI deep-research all create a Research record. See Research.
- Lookup — One-off discovery from a URL, domain, Maps URL, or text query. Three modes:
none(no AI),quick(basic extraction),deep(multi-page crawl + contact extraction). - Auto-enrichment — Background job that runs after every new account creation, discovering and scraping the website automatically.
Deduplication and merging
Section titled “Deduplication and merging”- Dedupe stack — The five-level matching pipeline run on every account creation: Google Place ID (100%) → name + city exact (95%) → phone (90%) → website domain (85%) → fuzzy name in same city (≥85%). Levels 1–4 auto-merge; level 5 surfaces for review.
- Golden record — The survivor row after a merge. Carries every unique field from every duplicate.
merge_history— Audit trail on the survivor recording absorbed-row snapshots, decisions, and overrides. Readable for forensic audit; not a one-click undo.- AI duplicate review — LLM pass that classifies each duplicate group as
same/different/uncertainto speed up triage of large lists. - Bulk merge — Multi-group merge action for resolving many duplicate groups in one request. Useful after a noisy import surfaces dozens of fuzzy candidates.
Filters and segmentation
Section titled “Filters and segmentation”- Custom field — Per-Company schema for data not in the standard model: store size, contract expiry, tier, etc. Eight types. Referenced in filters as
cf.<key>. - Saved filter — A named, reusable query over your Account database. Can be private (yours only) or shared across the Company. Powers smart lists, campaign bulk-add, and API queries.
- Filter DSL — The structured query format:
{match: "all"|"any", conditions: [{field, op, value}]}. - Match mode — Per-filter:
all(AND) orany(OR). No nested mixing. - Virtual field —
has_email/has_phone/has_website. Resolves to “is this column non-empty?” Onlyis_true/is_falseapply.
Dashboard
Section titled “Dashboard”- Outreach funnel — The three numbers on the dashboard home: contacts initiated, responded, closed (won). Each counts distinct accounts, not messages. Closed (won) only counts transitions to
customerthat stuck (current status is stillcustomerorlost) and weren’t tagged as a pre-existing relationship — see Account → Recording a pre-existing customer. - Cohort attribution — Responded and closed are attributed back to the initiation date, not the response date. So the rate at the latest day is “low by design” until accounts have had time to respond.
- Stats by product and campaign — Per-product and per-campaign breakdown of the funnel, with Cost column (total spend + most-meaningful CAC available).
See also
Section titled “See also”- How LeadHunter works — the end-to-end flow that ties all of this together.
- Quick start — fifteen-minute mechanical walkthrough.
- Concepts — every concept above has a dedicated page.