Skip to content

Build a saved filter

A saved filter, called a saved view in the app, 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 (Saved views menu in the filter bar)Live view of every account that matches the filter.
Add matching accounts to campaign (Accounts page)Adds every account the list shows (the saved view plus any search or other filters on top) to a campaign in one pass, honouring all guardrails. The dialog counts the matching accounts before you commit.
Rank (Accounts page)Scores every account the list shows against a product’s fit criteria, without a campaign. See Rank a list without a campaign.
API (/api/accounts/?saved_filter=<id>)Programmatic access — the same filter, same matches.
Advanced conditions (in the Filter panel of the Accounts list)Build ad-hoc, optionally save.

Everything that narrows the Accounts list sits in one bar above the table:

  • Search — name, email, phone, website or city.
  • Filter — opens a panel with the groups Quick conditions (Clients, Contacted, Not contacted, In a campaign, Not in a campaign), Status, Location (country, state / region, city), Profile and source (business type, source channel, imported from), Marketing partners and Advanced conditions. The button shows how many filters are set.
  • Saved views — a menu with your saved views and the shared ones.
  • Fit for — picks the product whose fit score the list shows.

Each filter set in the panel (and a saved view) shows as a chip under the bar; a chip’s × removes that filter and Clear all removes them all.

The quick condition Clients means accounts whose status is Client. It does not look at the Client relationship type.

Every filter is part of the page’s address, so a filtered list can be bookmarked or shared: copy the link from the browser and a teammate with access to the project gets the same filters.

On Accounts, click Filter. The simple groups cover most needs. For anything else, Advanced conditions at the bottom of the panel holds a list of condition rows, and those rows are what a saved view stores.

The advanced conditions have one Match mode at the top:

  • all conditions (AND), the default — every condition must be true. “Spanish clients” = country = Spain AND status = customer.
  • any condition (OR) — at least one condition must be true. “clients 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.

Open Saved views and click Save current conditions as view… (available once there is at least one advanced condition). Give it a name (e.g. “Spanish fintech prospects”) and decide whether to tick Share with everyone in this project:

  • Not ticked (private) — only you see and can use it. The default.
  • Ticked (shared) — visible and usable by every member of your project, marked · shared in the menu. Useful for “the canonical X list” everyone references.

A saved view stores the advanced conditions only. Search and the other filters of the panel are not part of it; to keep those too, share or bookmark the page link.

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, contract_end_at, do_not_contact_purposes, partner_stage, audience_size, created_at, updated_at.

A few worth highlighting:

  • status — the account’s status (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 — shown as Source channel in the app: the marketing channel that brought the account in (outbound, adwords, meta_ads, referral, …). Combine with in to scope to paid inbound: {acquisition_channel in [adwords, meta_ads, linkedin_ads]}.

Anything your project 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 account that came in through Adwords / Meta / LinkedIn Ads in Q1, regardless of status. Combine with Insights → Breakdown to see how the paid funnel converted. Re-running the same filter next quarter only needs the date updated.

On Accounts, pick your saved view in Saved views (or build the filter), then click Add matching accounts to campaign, at the right of the row of filter chips, and pick the campaign. The dialog adds exactly what the list shows: the view plus anything else you’ve narrowed the list by (search and everything set in the Filter panel). Before you confirm it counts them (N accounts match the list, the same number the list shows) and previews the outcome: how many would be added and how many each guardrail (DNC, clients, competitors, personal network, soft-blocked relationship types) would skip.

Incomplete conditions (a row with no value yet) are ignored, as on the list. To add only a few accounts instead, tick their rows and click Add to campaign in the bar that appears.

If nothing narrows the list at all, Add matching accounts asks you to confirm adding every account the list shows before it does anything.

The preview reads N new · M already in campaign · K blocked, and Add stays disabled when nothing would be added. If the number of matching accounts changes between the preview and the add (an import landed meanwhile), nothing is added: LeadHunter recounts and asks you to confirm the new number. One add takes at most 10,000 matching accounts: above that, narrow the list first. Marketing partners hidden from the list stay out of the add; tick Include marketing partners in the dialog to add them this time (useful for Press or Influencer campaigns), and Include trials to add accounts in trial. Through the API, a saved filter that was deleted or belongs to another project is refused with an error instead of being ignored.

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 Add — it’s a one-shot snapshot (if the matching accounts changed since the count, you’re asked to preview again). 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, add the matching accounts again periodically (accounts already in the campaign are skipped).

The Saved views menu on Accounts lists every view you own or that’s shared with the project. Click one to apply it (a Saved view: name chip shows it is on); the bin icon beside it deletes it, after you type its name to confirm. Deletes don’t affect the underlying accounts, and views are cheap to recreate. To change a view’s conditions, apply it, adjust the Advanced conditions and save it again under a new name.

Renaming a filter or flipping it between private and shared is done through the API (PATCH /api/saved-filters/{id}/). If you flip a shared filter to private, it disappears for everyone except you; the reverse 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 project team 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.