Skip to content

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?”

SurfaceWhat 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.

From Accounts → Filter (the funnel icon above the table), the filter-builder appears as a panel with a list of condition rows.

A filter has one match mode at the top:

  • All (AND, default) — every condition must be true. “Spanish customers” = country = Spain AND status = customer.
  • Any (OR) — at least one condition must be true. “customers or lost deals” = status = customer OR status = 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.

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.

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.

Three categories:

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 with in / not_in to slice the pipeline (“prospects and contacted, not lost”).
  • relationship_types — multi-tag (one account can be both client and partner). Use contains to 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 with in to scope to paid inbound: {acquisition_channel in [adwords, meta_ads, linkedin_ads]}.

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.

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}.

OperatorWorks onNotes
eq / neqanyExact match.
in / not_inanyValue is a list. Acts as OR within the field.
containstext, url, relationship_typesFor text fields → substring. For relationship_types → array contains the value.
starts_withtext, urlPrefix match.
gt / gte / lt / ltenumber, date, datetimeUse ISO strings for dates (2026-01-01).
exists / not_existsanyTrue when the field has any value (non-empty, non-null).
is_true / is_falseboolean, virtual has_*

”Spanish fintech prospects that have an email”

Section titled “”Spanish fintech prospects that have an email””
match: all
conditions:
country = Spain
status = prospect
cf.industry_segment = fintech
has_email is_true

Spanish 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.

Section titled “”Paid-inbound accounts from this quarter, sorted by recency””
match: all
conditions:
acquisition_channel in [adwords, meta_ads, linkedin_ads]
acquired_at gte 2026-01-01

Pulls 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.

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.

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.

  • 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 in for the OR side and all for the AND side.
  • Forgetting that contains on relationship_types is array-membership, not substring. {relationship_types contains partner} matches accounts that have partner in 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 using not_in and 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.