Build a saved filter
A saved filter is a stored query over your accounts. You define the conditions once and re-use the filter everywhere LeadHunter accepts one — the accounts list, campaign bulk-add, the API. Think of them as smart lists that stay in sync as your data changes: an account that newly matches the filter shows up automatically, and one that drifts out disappears the same way.
Saved filters are the answer to “how do I target the same audience across three campaigns without re-picking accounts each time?”
Where you use a saved filter
Section titled “Where you use a saved filter”| Surface | What it does |
|---|---|
| Accounts list (sidebar shortcut) | Live view of every account that matches the filter. |
Campaign bulk-add (Bulk-add from filter) | Pulls every matching account into the campaign in one click, honouring all guardrails. The reach estimator tells you exactly how many will land before you commit. |
API (/api/accounts/?saved_filter=<id>) | Programmatic access — the same filter, same matches. |
| Inline filter (the filter-builder in the Accounts list) | Build ad-hoc, optionally save. |
Building a filter from the UI
Section titled “Building a filter from the UI”From Accounts → Filter (the funnel icon above the table), the filter-builder appears as a panel with a list of condition rows.
Step 1: Pick the match mode
Section titled “Step 1: Pick the match mode”A filter has one match mode at the top:
- All (AND, default) — every condition must be true. “Spanish customers” =
country = SpainANDstatus = customer. - Any (OR) — at least one condition must be true. “customers or lost deals” =
status = customerORstatus = lost.
There’s no nested mixing of AND and OR. When you need “(A and B) or (C and D)”, save two filters and combine them at the campaign level — or use one of the multi-value operators below (in, not_in) which already act like OR within a single field.
Step 2: Add conditions
Section titled “Step 2: Add conditions”Click + Add condition and pick the field, then the operator, then the value. The form adapts to what you pick — a date field gets a date picker, a multiselect gets a chip selector, a boolean gets a toggle.
Step 3: Save it
Section titled “Step 3: Save it”Click Save filter. Give it a name (e.g. “Spanish fintech prospects”), optionally a description, and pick Private or Shared:
- Private — only you see and can use it. The default.
- Shared — visible and usable by every member of your company. Useful for “the canonical X list” everyone references.
You can flip a filter between private and shared at any time if you own it. Shared filters protect against drift: when one person edits it, everyone sees the update.
What fields can you filter on?
Section titled “What fields can you filter on?”Three categories:
Standard account fields
Section titled “Standard account fields”The columns LeadHunter knows about on every account:
name, country, city, state_province_region, postal_code, email, phone, website, business_type, specialization, language, rating, source, is_verified, status, relationship_types, acquisition_channel, acquired_at, created_at, updated_at.
A few worth highlighting:
status— the lifecycle (prospect,contacted,in_negotiation,customer,lost,do_not_contact). Combine within/not_into slice the pipeline (“prospects and contacted, not lost”).relationship_types— multi-tag (one account can be bothclientandpartner). Usecontainsto match any account that carries a given type:{relationship_types contains partner}finds every partner account, whether it’s also a client or not.acquisition_channel— the marketing channel that produced the lead (outbound,adwords,meta_ads,referral, …). Combine withinto scope to paid inbound:{acquisition_channel in [adwords, meta_ads, linkedin_ads]}.
Custom fields (cf.<key>)
Section titled “Custom fields (cf.<key>)”Anything your company defines under Settings → Custom fields. Reference them with the cf. prefix — e.g. cf.tier, cf.contract_renewal_date, cf.fleet_size. The operators available depend on the field’s type (number / date / select / multiselect / text / boolean / url).
See Custom fields for how to define them.
Virtual “has X” booleans
Section titled “Virtual “has X” booleans”Three convenience flags that resolve to “is this column non-empty?”:
has_email— account has an email on the org row.has_phone— account has a phone.has_website— account has a website.
Only is_true / is_false apply. Useful for filtering out accounts that aren’t reachable: “prospects with a phone and a website, missing email is OK” = {has_phone is_true} AND {has_website is_true}.
Operators
Section titled “Operators”| Operator | Works on | Notes |
|---|---|---|
eq / neq | any | Exact match. |
in / not_in | any | Value is a list. Acts as OR within the field. |
contains | text, url, relationship_types | For text fields → substring. For relationship_types → array contains the value. |
starts_with | text, url | Prefix match. |
gt / gte / lt / lte | number, date, datetime | Use ISO strings for dates (2026-01-01). |
exists / not_exists | any | True when the field has any value (non-empty, non-null). |
is_true / is_false | boolean, virtual has_* |
Two worked examples
Section titled “Two worked examples””Spanish fintech prospects that have an email”
Section titled “”Spanish fintech prospects that have an email””match: allconditions: country = Spain status = prospect cf.industry_segment = fintech has_email is_trueSpanish prospects in your fintech segment that you can actually email. Save this and use it to power weekly outreach campaigns — every new fintech-tagged prospect you add appears in the next campaign automatically.
”Paid-inbound accounts from this quarter, sorted by recency”
Section titled “”Paid-inbound accounts from this quarter, sorted by recency””match: allconditions: acquisition_channel in [adwords, meta_ads, linkedin_ads] acquired_at gte 2026-01-01Pulls every Adwords / Meta / LinkedIn Ads lead from Q1, regardless of status. Combine with Stats by product and campaign to see how the paid funnel converted. Re-running the same filter next quarter only needs the date updated.
Using a filter in a campaign
Section titled “Using a filter in a campaign”From the campaign’s accounts panel, click Bulk-add from filter and pick your saved filter. The reach estimator tells you exactly how many accounts will land before you commit — it accounts for every guardrail (DNC, customers, competitors, personal network, soft-blocked relationship types) so the number you see is what will actually be added.
After confirmation, every matching account is added in one pass. The response tells you what was created vs. blocked vs. already-in-the-campaign, with per-block-reason ID lists so you know exactly what to flip (include_customers, include_press, etc.) if you want to override.
The filter is evaluated at the moment you click bulk-add — it’s a one-shot snapshot. Later additions to the filter’s matches don’t auto-join the campaign. If you want the campaign to keep growing as new matches arrive, re-run bulk-add periodically.
Editing and sharing
Section titled “Editing and sharing”From Accounts → Saved filters (sidebar), every filter you own or that’s shared with the project shows up. Open one to edit conditions, rename, flip private↔shared, or delete. Deletes are immediate (filters are cheap to recreate); they don’t affect the underlying accounts.
If you flip a shared filter to private, it disappears for everyone except you. The reverse — private to shared — makes it visible to the whole project immediately.
Common pitfalls
Section titled “Common pitfalls”- Building mixed AND/OR in one filter. The match mode is per-filter, not per-condition. When you genuinely need “(A and B) or (C and D)”, save two filters and call bulk-add twice, or restructure to use
infor the OR side andallfor the AND side. - Forgetting that
containsonrelationship_typesis array-membership, not substring.{relationship_types contains partner}matches accounts that havepartnerin the array, not accounts whose tags contain the word “partner” as a substring. The two coincide for short tag names but the semantics matter when you start usingnot_inand overlaps. - Sharing a private-by-default filter without renaming it. “My experiment” is fine while it’s yours; not great when your whole company starts using it. Rename before sharing.
- Expecting bulk-add to be subscriber-style. The filter is evaluated once at the moment of bulk-add. It’s not a saved subscription — re-run if you want the campaign to absorb later additions.
Read next
Section titled “Read next”- Custom fields — define
cf.*keys your filters will reference. - Run your first campaign — use the filter to populate the campaign in one click.
- Track inbound leads — set
acquisition_channelso the filter can slice by source. - Merge duplicates — clean up the database so the filter’s matches are accurate.