Custom Bitrix24 Filters: Development for Business Needs

Imagine: a manager needs to see deals where the total payments in the last 30 days are less than 50% of the deal amount. Or companies that have at least one deal at the 'Negotiation' stage with an amount > 1,000,000. The standard Bitrix24 filter cannot aggregate data from linked entities or execute

Our competencies:

Frequently Asked Questions

Imagine: a manager needs to see deals where the total payments in the last 30 days are less than 50% of the deal amount. Or companies that have at least one deal at the 'Negotiation' stage with an amount > 1,000,000. The standard Bitrix24 filter cannot aggregate data from linked entities or execute subqueries. We develop custom Bitrix24 filters that solve these tasks—from aggregate filtering to 1C integration. We'll assess your project in 1 day, just reach out.

Our custom Bitrix24 filter development focuses on aggregate filtering, linked entity filtering, and complex CRM queries using the Bitrix24 REST API. This enables advanced reports and presets not available out of the box.

How the Standard Filter in Bitrix24 Works

In Bitrix24, the JS component BX.Main.Filter is responsible for filtering. It renders the panel, collects user input, and passes it to the backend handler. In the self-hosted version, the filter operates with ORM classes: \Bitrix\Crm\DealTable, \Bitrix\Crm\ContactTable. Each field maps to an ORM entity column. In the cloud version, filtering goes through the REST API—the filter parameter in methods like crm.deal.list, crm.item.list. Supported operators: =, !, <, >, <=, >=, %, array of values (IN). Not supported: grouping of AND/OR conditions at the filter level, aggregate functions, subqueries.

Why the Standard Filter Is Not Enough

Business processes require selection by metrics: "overdue more than 7 days", "clients with no activity for a month", "deals with accounts receivable in 1C". Without a custom filter, managers manually export data to Excel or spend hours on batch requests. A custom filter automates this work and reduces search time to seconds.

Architecture of a Custom Filter

A custom filter is a REST application with three layers:

  1. Filter UI—your interface in an iframe (placement LEFT_MENU or CRM_*_LIST_TOOLBAR). The user sets parameters: period, amount threshold, entity type.

  2. Backend handler—your server that accepts parameters, executes a complex query, and returns a list of IDs of matching items.

  3. Result display—filtered data is shown in a custom list or passed back to the standard list via a preset filter.

Comparison of Filtering Approaches

Criteria Standard Filter Custom Filter
Aggregation over linked entities No Yes (on backend)
Subqueries No Yes (SQL or REST chain)
Caching Only at database level Redis / server-side with TTL
Integration with external systems No Via REST API or direct SQL
Performance on 10,000 records ~100 sec (batch) <1 sec (with cache)

A custom filter is up to 50 times faster than the standard one on large volumes.

HowTo: Filtering by Aggregates in Bitrix24

Follow these steps to implement a custom aggregate filter:

  1. Collect data: Retrieve active deals via crm.deal.list with filter STAGE_SEMANTIC_ID=P. For each deal, fetch product items and payment history via crm.timeline.list or a custom field with payment amounts.

  2. Perform backend aggregation: On your server, calculate payment_percentage = total_payments_30days / deal_amount * 100. If payment_percentage < 50, include the deal in the result set.

  3. Cache results: Store the result in Redis with a TTL of 15–30 minutes to avoid repeated calculations on subsequent filter requests.

  4. Display filtered IDs: Pass the list of filtered deal IDs to the UI or form a preset filter ID in the standard list using BX24.openPath('/crm/deal/list/?apply_filter=Y&ID[]=' + filteredIds.join('&ID[]=')).

This approach leverages server-side aggregation and incremental cache updates via webhooks (onCrmDealUpdate) for optimal performance. By using denormalization and materialized views, we achieve sub-second response times even on 10,000+ records.

Filtering by Linked Entities

Scenario: find companies that have at least one deal at the "Negotiation" stage with amount > 1,000,000. In the standard company filter, there are no deal fields. Solution: 1) request crm.deal.list with filter by stage and amount → get COMPANY_ID; 2) unique IDs → array for company filter; 3) request crm.company.list with filter: {ID: uniqueCompanyIds}. On the backend, this is a single SQL query with JOIN; via REST, it's a chain of 2–3 requests.

Custom Filter Presets

Presets save frequently used conditions: "Overdue > 7 days", "VIP clients with no activity", "Deals without tasks". The REST API has no method for programmatically creating standard filter presets, so we implement a custom UI with buttons:

var presets = { overdue_7: {'>DATE_CLOSE': formatDate(-7), 'STAGE_SEMANTIC_ID': 'P'}, vip_inactive: {'UF_CRM_VIP': 1, '<DATE_MODIFY': formatDate(-30)}, no_tasks: {} // server logic }; function applyPreset(name) { loadFilteredData(presets[name]); } 

The "Deals without tasks" preset requires a batch request tasks.task.list with filter UF_CRM_TASK for each deal—solved with server-side aggregation.

Performance and Limits

The REST API limits: 2 requests per second, 50 commands per batch. For a filter on 10,000 deals:

Approach Requests Time
Sequential requests of 50 200 ~100 sec
Batch of 50 commands 4 batch requests ~8 sec
Server cache + incremental update 1–2 requests <1 sec
Server cache detailsServer-side cache with periodic synchronization via webhooks (onCrmDealUpdate) or by schedule is the only working approach for production. Data is updated incrementally: when a deal changes, the webhook invalidates the cache, and the next request recalculates only the changed records. This reduces API load and speeds up filtering.

Self-Hosted Version: Filters via ORM

In a self-hosted Bitrix24, a custom filter is implemented at the PHP level—extending the standard filter with new fields via the onBuildFilterFields event. The onBuildFilterQuery handler modifies the SQL query. This is more performant than REST but requires server access.

What's Included in the Work

  • Analytics: studying business logic and filtering requirements.
  • Design: architecture of UI/backend, caching scheme.
  • Development: server-side logic, integration with REST API / ORM, implementation of presets.
  • Testing: load testing on your data, selection accuracy verification.
  • Documentation: description of filters, admin manual.
  • Support: 1 month after delivery—revisions and consultations.

Timelines range from 5 to 20 days depending on complexity. We have 10+ years of experience in Bitrix24 and certified specialists—we guarantee quality and adherence to deadlines. Without a custom filter, you waste significant time on manual processing—development pays off within a few months. A typical investment of $1,000–$5,000 eliminates $500/month in manual labor, yielding ROI in 2–10 months. This custom filter investment of $2,000 typically saves $500 each month, resulting in an ROI of 4 months. This enables building complex Bitrix24 reports unavailable with standard tools. Contact us for a project assessment. Get a consultation.