Custom Business Process Actions for Bitrix24: Turnkey Development
Standard Bitrix24 Business Process actions — send email, update field, create task. That's not enough for integration tasks. For example, when a approval process needs to fetch data from 1C, create a document in SharePoint, or send a message to Telegram. Our engineers with 10+ years of experience develop custom actions for business processes turnkey. Over 10 years we have completed more than 500 automation projects. A custom action is a PHP class inheriting \Bitrix\Bizproc\Activity\BaseActivity or CBPActivity. It is registered as a handler for the OnBizProcActivityList event. Unlike CRM robots, a custom action is available in all business process editors — for lists, disk, CRM. We develop both simple synchronous actions and asynchronous ones with retry logic. Get a consultation — we will assess your task and propose the optimal solution.
Why Custom Actions?
A custom action is a PHP class inheriting \Bitrix\Bizproc\Activity\BaseActivity (modern API) or CBPActivity. It is registered as a handler for the OnBizProcActivityList event. Unlike CRM robots, a custom action is available in all business process editors — for lists, disk, CRM. We develop both simple synchronous actions and asynchronous ones with retry logic.
How to Choose: REST API or PHP Module?
| Criterion | REST API | PHP Module |
|---|---|---|
| Cloud | Yes | No |
| On-premise | Yes | Yes |
| Execution time | 5 sec limit (sync) | Unlimited |
| Deployment complexity | Low (webhook) | High (file modification) |
| Return values | Via callback | Directly |
| Version management | Automatic | Manual |
For quick integration, REST API is better; for complex logic inside on-premise, PHP module is better. We will assess your scenario for free.
How to Develop a Custom Action via REST API?
Register using the bizproc.activity.add method according to the official Bitrix24 documentation. Example:
$client->call('bizproc.activity.add', [ 'CODE' => 'GET_1C_PRICE', 'HANDLER' => 'https://my-server.com/bp-activity-handler', 'AUTH_USER_ID' => 1, 'NAME' => [ 'ru' => 'Получить цену из 1С', 'en' => 'Get price from 1C', ], 'USE_SUBSCRIPTION' => 'Y', 'PROPERTIES' => [ 'article' => [ 'Name' => ['ru' => 'Артикул товара'], 'Type' => 'string', 'Required' => 'Y', ], ], 'RETURN_PROPERTIES' => [ 'price' => [ 'Name' => ['ru' => 'Цена из 1С'], 'Type' => 'double', ], 'available' => [ 'Name' => ['ru' => 'В наличии'], 'Type' => 'bool', ], ], ]); USE_SUBSCRIPTION: Y — mandatory if the action takes longer than 5 seconds. Bitrix24 returns 200 immediately, and the handler asynchronously sends the result via bizproc.event.send. Without this token, the workflow will hang.
Development steps:
- Define the code and parameters — set a unique
CODEand describePROPERTIES,RETURN_PROPERTIES. - Call
bizproc.activity.add— pass theHANDLERURL, setUSE_SUBSCRIPTIONtoYfor async actions. - Implement the handler — a script on your server receives a POST request from Bitrix24, executes business logic, and sends the result via
bizproc.event.sendwith the correctevent_token. - Test — run the process with various scenarios, check error handling and timeouts.
Developing a PHP Action for On-Premise Bitrix24
The class is registered in the file system. Structure:
class My1CPriceActivity extends \Bitrix\Bizproc\Activity\BaseActivity { protected function execute(array &$arProperties) { $article = $this->getFieldValue('article'); $result = \My1CConnector::getPrice($article); if ($result->isSuccess()) { $this->setResultValue('price', $result->getPrice()); $this->setResultValue('available', $result->getAvailable()); } else { $this->writeToTrackingService( 'Ошибка запроса к 1С: ' . $result->getErrorMessage() ); } return \CBPActivityExecutionStatus::Closed; } public static function getPropertiesDialog($params) { // Render configuration form } } The writeToTrackingService method writes to the BP log — important for debugging.
Real Case: Automating approval of requests with credit limit verification
Task: a distributor, process for approving shipment requests with deferred payment. Need to get the credit limit and debt from CRM, then automatically approve or route to manual approval.
Solution: developed a custom PHP action CheckCreditLimitActivity. Parameters: company ID in CRM, request amount. It queries the internal API of the financial system via HTTP, returns variables available_limit and approval_required. Then in the BP, a condition: if approval_required = true — task to financial director, otherwise — automatic approval.
Challenge: the financial system was unavailable in 3–5% of cases. Added retry logic: the action repeats the request for up to 30 minutes via agent, if unavailable — transfers the request to manual approval with notification.
Result: the approval cycle reduced from 4 hours to 20 minutes for automatic requests (68% of cases). The cost of developing this case was 45,000 rubles.
Common Mistakes in Development
- Timeout without USE_SUBSCRIPTION — synchronous handler longer than 5 seconds, process hangs.
- Missing event_token — result does not reach the BP, workflow waits indefinitely.
- Unhandled exception in PHP action — crashes the entire workflow. Always use try-catch.
What's Included?
- Analysis — breakdown of business process and integration requirements.
- Design — architecture choice (REST/PHP), protocol agreement.
- Implementation — coding, action registration, parameter form configuration.
- Testing — on a test process with edge cases.
- Documentation — installation and usage instructions.
- Support — 30-day warranty support.
Development Timeline
| Task | Time |
|---|---|
| Simple synchronous action | 2–3 days |
| Asynchronous action with retry | 4–6 days |
| PHP action with UI form | 5–7 days |
| Testing, debugging, documentation | 2–3 days |
Turnkey custom action development takes 1–2 weeks depending on complexity. Savings from implementation — up to 100,000 rubles per month. Project assessment is free. Contact us to discuss your task — get a consultation and commercial offer.

