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:
-
Filter UI—your interface in an iframe (placement
LEFT_MENUorCRM_*_LIST_TOOLBAR). The user sets parameters: period, amount threshold, entity type. -
Backend handler—your server that accepts parameters, executes a complex query, and returns a list of IDs of matching items.
-
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:
-
Collect data: Retrieve active deals via
crm.deal.listwith filterSTAGE_SEMANTIC_ID=P. For each deal, fetch product items and payment history viacrm.timeline.listor a custom field with payment amounts. -
Perform backend aggregation: On your server, calculate
payment_percentage = total_payments_30days / deal_amount * 100. Ifpayment_percentage < 50, include the deal in the result set. -
Cache results: Store the result in Redis with a TTL of 15–30 minutes to avoid repeated calculations on subsequent filter requests.
-
Display filtered IDs: Pass the list of filtered deal IDs to the UI or form a preset filter
IDin the standard list usingBX24.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 details
Server-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.

