Optimize Lists in Bullhorn Automation

ListsClosed A collection of ATS records that meets specified criteria, such as a scheduled end date or a low NPS response. are the foundation of every automation in Bullhorn Automation. Well-built lists run faster, return more accurate results, and help your automations perform reliably. Poorly constructed lists can cause long processing times, infinite loops, and unexpected behavior in your workflows.

Common Reasons You Might Need This Article

  • Your lists are taking a long time to sync or process.

  • An automation is running more times than expected for a single candidate.

  • You're unsure whether to use an Always Updated List or a One-Time List.

  • You want to refine broad list criteria to improve performance.

  • You're troubleshooting unexpected results from your list criteria.

  • You need to test list logic before applying it to a live automation.

Build and Test Lists Using Advanced Search

Creating lists directly in the Automations section means you can't preview results before saving, which can lead to trial-and-error troubleshooting. Building lists through Advanced Search gives you the ability to preview results and adjust your criteria before saving or syncing.

The Advanced Search window works just like the List Builder. Select your entity record type (Candidates, Jobs, Leads, Placements, Sales Contact, Submission), define your criteria logic, and review the total number of matched records. When you select Search, the results area provides an overview of matched entity records so you can review and make changes before committing.

To test with minimal risk, use ATS ID > Is > [test record #] to run the automation against only test records first. Remove that criteria once you're satisfied with the results.

Scenarios Where Testing List Criteria Helps

Testing in Advanced Search is useful when you're not sure which field or approach will give the best results. Here are some common scenarios where previewing results helps you make a better decision.

  • You're building an automation around active placements and aren't sure whether to return candidates associated with placements or individual placement records. Try both approaches in Advanced Search and compare.

  • You need to choose between similar fields like Has Note vs. Last Note Date. Testing in Advanced Search shows you which field returns more accurate results for your use case.

  • You want to segment an existing list to find discrepancies. Start with the In List criteria, then add AND/OR statements to isolate specific groups within the list.

  • You're working with date values and want to confirm whether records fall before or after a target date. Advanced Search provides a brief explanation of the date logic being applied so you can verify the results match your expectations.

Keep List Criteria Focused

Broad or overly complex criteria can slow down list processing and return more records than you actually need. Keeping your criteria targeted reduces sync times and makes your lists easier to maintain and troubleshoot.

Narrow Your Record Set Over Time

If you're running a list to find errors or omissions — such as missing email addresses — you may need to scan all existing records on the first pass. After that initial analysis, update the criteria to target only newly created records so the system doesn't reprocess your entire historical database every time the list syncs.

Use IS Instead of CONTAINS When Possible

Searching large data sets with CONTAINS criteria can slow down list processing because the system scans and analyzes the content of every record. IS and IS NOT compare exact values directly, making them significantly faster. Use CONTAINS only when partial matching is truly necessary — for example, searching for all email addresses that contain a specific domain.

Add Multiple Values in a Single Criteria Box

When a criteria field needs to match several values, adding each value as a separate criteria box creates unnecessary processing overhead. Instead, add all values into a single box by pressing Tab after each entry. This performs better and keeps your list criteria easier to read.

Limit NOT Criteria

Overusing NOT criteria can make lists harder to build, read, and troubleshoot. NOT conditions are also inherently more complex to evaluate, which can lead to mistakes — especially when you're first getting started with Bullhorn Automation. In many cases, using IS criteria to define exactly what you want is simpler and more efficient than ruling out everything you don't want.

Key Takeaway: Structure Criteria to Narrow Records Early

List performance depends less on how many lists you have and more on how your criteria are structured. The most effective approach is to layer your criteria so that fast, simple filters run first and reduce the candidate pool before any heavier logic kicks in.

  1. Start with IS filters that evaluate quickly. Fields like Candidate Subscription Status and Candidate Status act as true/false checks — the system is just matching a value, not running a calculation. For example, begin with criteria like Subscription Status is "Subscribed," Email has email, and Status is "New Lead, Assigned, In Progress" (or whichever positive statuses apply to your use case). These fast filters narrow the candidate count early.

  2. Layer in date or activity-based criteria after the initial filters. Fields like Submission Date require the system to look up related entity records rather than pulling directly from the candidate record, which takes more processing time. By placing these cross-entity lookups after your simple IS filters, the heavier logic runs against a much smaller set of records instead of your entire candidate pool.

One well-structured list with layered criteria often performs better than several broken-out lists with broad or unoptimized filters.

Choose the Right List Type

Selecting the wrong list type can lead to stale data or unnecessary rework. Understanding when to use each type helps you match your lists to the right use case.

  • One-Time Lists capture a snapshot of records at the time of creation. They're useful for generating reports or comparing data at specific points in time. However, they can't be edited or updated after creation, so new or updated records won't appear.

  • Always Updated Lists automatically refresh to reflect current data. For most automations, Always Updated Lists are the better choice because they ensure your workflows always act on the latest information.

Avoid Self-Referencing Lists

A self-referencing list is a list that directly or indirectly depends on itself. Review your list dependencies to make sure no circular references exist. If a list is stuck in a long sync or never finishes processing, a self-referencing dependency is one of the first things to check.

List A requires List B to sync, but List B also requires List A. When this happens, neither list can complete processing.

This creates long or infinite loops that stall your automations and make troubleshooting difficult.

Select the Right Entity for Your List

The entity you choose for a list determines which records it returns — and choosing the wrong one can cause automations to fire more often than intended. Entities like Submissions and Placements can have multiple records per candidate.

If a candidate has seven submissions and you build an automation that updates the candidate's status based on submission status, that status could update seven times — once per submission. Before building a list, consider whether the entity you've selected could return duplicate actions for the same person. If you only need one action per candidate, use the Candidate entity instead.

Troubleshooting

If your list is taking too long to sync

Long sync times usually point to broad criteria that return a large number of records. Review your list for conditions that could be narrowed — add date filters, switch from CONTAINS to IS criteria, or reduce the historical record set. Also check whether the list has a self-referencing dependency that could be creating a processing loop.

If an automation is firing more times than expected

Check whether your list uses a Submission or Placement entity. These entity types can have multiple records per candidate, which causes the automation to run once per record rather than once per person. If the automation should only trigger once per candidate, consider switching to the Candidate entity.

If your list results don't match what you expected

Use Advanced Search to test your criteria and preview results before saving. Look for conflicting NOT criteria or overly broad CONTAINS conditions that may be including or excluding records you didn't intend. Also verify that similar fields — like Has Note vs. Last Note Date — are returning the data you actually need for your use case.

FAQs

Should I build my list in the Automations section or through Advanced Search?

Advanced Search is recommended. It lets you preview results and test different criteria before saving, so you can catch issues early without affecting live automations.

Can I convert a One-Time List to an Always Updated List?

No. One-Time Lists are locked after creation and can't be changed to Always Updated Lists. If you need your list to reflect current data, create a new Always Updated List with the same criteria.

How do I check if my lists have a circular dependency?

Look at the criteria for each list involved. If List A includes "In List B" as a criteria, and List B includes "In List A," that's a circular dependency. Remove one of the cross-references to resolve the loop.

What's the difference between IS and CONTAINS criteria for performance?

IS compares exact values directly, which is fast. CONTAINS scans the content of every record in the data set looking for partial matches, which takes significantly longer — especially on large data sets. Use IS whenever an exact match will give you the results you need.

When should I use a One-Time List instead of an Always Updated List?

Use One-Time Lists when you need a snapshot for reporting or point-in-time comparisons. For most automations and ongoing workflows, Always Updated Lists are more appropriate because they reflect current data.

Can I use the same list in multiple automations?

Yes. A single list can be referenced by multiple automations. This is a good practice when several automations need to act on the same group of records — it reduces duplication and keeps your criteria consistent.

Why does narrowing my list criteria matter after the first sync?

On the first sync, broad criteria help you scan your full data set. But if you leave those broad criteria in place, the system reprocesses all those historical records every time the list syncs. Narrowing to newly created or recently updated records after the initial pass keeps sync times fast and reduces unnecessary processing.