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?”
Where you use a saved filter
Section titled “Where you use a saved filter”| Surface | What 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. |
The filter bar on Accounts
Section titled “The filter bar on Accounts”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.
Building a filter from the UI
Section titled “Building a filter from the UI”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.
Step 1: Pick the match mode
Section titled “Step 1: Pick the match mode”The advanced conditions have one Match mode at the top:
- all conditions (AND), the default — every condition must be true. “Spanish clients” =
country = SpainANDstatus = customer. - any condition (OR) — at least one condition must be true. “clients 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”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.
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, 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 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— shown as Source channel in the app: the marketing channel that brought the account in (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 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.
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 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.
Using a filter in a campaign
Section titled “Using a filter in a campaign”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).
Editing and sharing
Section titled “Editing and sharing”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.
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 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.
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 accounts — set
acquisition_channelso the filter can slice by source. - Merge duplicates — clean up the database so the filter’s matches are accurate.