[object Object]

A 5K-contact org barely notices filter performance. A 200K-contact org notices every filter that takes more than four seconds. Here is how the filter engine works in Freshsales and the patterns that keep it fast.

What gets indexed by default

Freshsales indexes the standard fields you would expect: owner, email, phone, lifecycle stage, created_at, updated_at, last_contacted, lead_score. Custom fields are not indexed unless you mark them as such in the field admin. Filtering on an unindexed custom dropdown forces a full scan.

You get up to 10 custom indexed fields per module on most plans. Use them.

Filter combinations cost compounding

Two filters joined by AND on indexed fields are fast. Two filters joined by OR force a union scan. Three OR conditions across mixed indexed/non-indexed fields can take 30 seconds on a 200K table.

Rewrite OR filters as separate saved views when possible. Reps switch between views faster than they wait for a slow filter to load.

Smart lists versus filters

A smart list is a saved filter that materializes a count and refreshes on a schedule. The list page loads instantly because the result set is precomputed. Use smart lists for any filter you run more than twice a day.

The cost is freshness: the list lags the underlying data by up to 15 minutes. For “contacts created today” that is fine. For “deals closing in the next hour,” use a live filter.

Bulk segmentation strategy

If you find yourself filtering on five fields to define a segment, write the segment to a tag instead. Run a nightly workflow that sets segment = "ICP-Tier-1" on contacts matching the criteria. Then your daily filter is a single indexed field lookup.

This trades freshness for speed. Tag-based segmentation lags by a day; if your business needs same-day segmentation, run the workflow hourly.

Pagination behavior

The contact list pages 25 at a time by default. Setting it to 100 quadruples the data fetched per page but cuts pagination clicks. The breakeven for performance is around 50; above that, the response payload starts to dominate render time.

Mobile filters

The mobile app supports a subset of filter operators. “Contains” works, “matches regex” does not. If your saved view uses an unsupported operator, mobile silently shows zero results. Check every saved view on mobile after a desktop edit.

Export performance

Filter then export is the right order. Filtered exports honor the filter and stream up to 500K rows. Unfiltered exports above 100K rows often time out; use the API instead, paginated at 100 per call with a sleep to respect rate limits.

What to do this week

Run your three most-used contact filters and time them. Anything over five seconds, check whether the fields are indexed. If not, mark the worst offender as indexed and re-test.

[object Object]
Share