Skip to content
N1
CRM, integrations and automation

I bring order to your Bitrix24, CRM and business processes

I fix what slows the business down: duplicate mess in the CRM, integrations that quietly stop working, manual routines that should have been automated years ago. I deliver a solution that actually works — documented and supported after launch.

Bitrix24 Laravel API integrations
5+
years of experience
50+
integrations
100+
automated processes
10+
business industries
Own code
not a Bitrix24 drag-and-drop builder
I work officially: Contract Invoice Closing documents Prepayment Final payment after acceptance Retainer support by agreement

Choose your situation

A short path for your task — pick what fits best.

What I solve

If the CRM is unstable, data diverges, an integration fails without a clear error, or the old code is scary to touch — I first find the cause, then propose a safe fix plan.

Leads are created as duplicates Deals are not linked to leads Robots fire at the wrong stage Business processes hang The CRM slows down under load Sync works "sometimes" Impossible to understand the cause of an error No exchange history Reports do not match reality The old code is scary to touch

Click a card to open the full description

Ready-made solution paths

Some tasks ship faster on a ready-made skeleton.

Bitrix24 D7 · box · internal APIs

Bitrix24 D7: boxed development and stabilization

I work not only with interface settings, but at the level of the box, the code and internal APIs.

When you need it
  • REST already overloads the portal
  • Standard robot setup is not enough
  • Custom event handlers are needed
  • Heavy operations slow the CRM down
  • Custom tabs and actions in the card are needed
  • Logic is "scattered" and breaks on changes
What's included
D7 modules Event handlers Agents / cron HL blocks Smart processes (SPA) Business processes Robots and triggers Custom CRM tabs and actions Optimization of heavy operations Moving heavy logic from REST to D7
What the client gets
  • Stable logic inside the portal
  • Clear logs and diagnostics
  • Less load on REST
  • Documentation of entry points
  • Maintainable code structure
Risks and limits
  • I do not replace a full DevOps/SRE
  • For production changes I first review logs and make a backup
  • I give the exact price after access to the portal
Laravel · API · queues · tests

A Laravel backend you can maintain

APIs, admin panels, client cabinets and integration hubs on Laravel — with logs, tests and a clear structure.

When you need it
  • Need an external product on top of the CRM
  • Need an API or an integration hub
  • The logic does not fit in the box
  • Need queues and background jobs
  • Need an admin panel with roles
What's included
Service layer FormRequest validation Queues and jobs Roles and access Logging Tests (PHPUnit) Admin panels REST API Integration panels
What the client gets
  • Errors are visible in logs
  • Heavy operations go to a queue
  • The project is easier to maintain
  • New features without chaos
  • Testable code
Risks and limits
  • I prepare infrastructure within my own solution, not as DevOps outsourcing
  • A full rework of an old project — as a separate estimate
REST · webhooks · logs · retry

API integrations with logs, retry and duplicate protection

An integration is not just a REST request. You need mapping, logs, error handling, retry, duplicate protection and a clear exchange status.

When you need it
  • Sync works "sometimes"
  • Duplicates appear
  • Data diverges between systems
  • No exchange history
  • The error is not visible to the user
  • The CRM needs to be connected to an external service
What's included
Bitrix24 1C MoySklad TrustMe PKB ADATA HeadHunter Huntflow Telegram WhatsApp Asterisk
What the client gets
  • Data is not lost
  • Duplicates are not created
  • The exchange does not fail silently
  • Clear logs of incoming/outgoing requests
  • The ability to retry a failed operation
Risks and limits
  • I am not responsible for failures on the side of external services and providers
  • I mask secrets and do not log tokens
  • First a test environment, then production
Approvals · reports · background jobs

Business process automation

When employees transfer data manually, reconcile spreadsheets, lose requests or repeat the same actions — I turn the routine into code.

When you need it
  • Data is transferred manually
  • Spreadsheets are reconciled between systems
  • Requests get lost
  • Approvals happen "verbally"
  • No deadline control
  • Reports are assembled by hand
What's included
Approvals Notifications Reports Data transfer Deadline control Employee requests Client statuses Background checks
What the client gets
  • Less manual work
  • Requests and approvals are not lost
  • Transparent deadlines and statuses
  • Reports assemble themselves
Risks and limits
  • First I record the current process, then automate it
  • Complex scenarios — in stages
  • Depends on access and the systems' data
Audit · problem map · stabilization

Legacy audit: find the cause, don't just treat the symptom

When the project already works but breaks, there is no documentation, and rewriting everything from scratch is risky — I first find the cause, then propose a safe plan.

When you need it
  • The developer left, the code stayed
  • No documentation
  • No logs
  • Processes break
  • Scary to touch production
  • You need the cause, not a "symptom fix"
What's included
Project structure overview Search for critical risks Logging check Integrations check Duplicate and data-error check Problem map Fix plan Timeline and budget estimate
What the client gets
  • A clear problem map
  • Priorities and a plan
  • Timeline estimate
  • Recommendations on logs and architecture
  • Understanding of what can be left as is
Risks and limits
  • I do not touch production blindly
  • I make a backup when there is a risk of data loss
  • A full architecture rework — as a separate estimate
Integrations · Working skeleton

Integration Hub

Adaptation time: from 5–10 business days Cost: from 220,000 ₸

A separate backend hub for exchange between the CRM and external systems — with logs, queues and manual retry.

What problems it solves
  • Integrations fail silently
  • No exchange history
  • A failed operation cannot be retried
  • Data gets duplicated
Who it is for
Companies with several external systems Businesses where integrations work "sometimes"
What's in the base version
  • Integrations
  • Exchange logs
  • Retry / backoff
  • Encrypted secrets
  • Health-check
  • Queues
  • Admin panel
What can be adapted
Bitrix24 1C MoySklad Telegram any REST API
Architecture
External API → Webhook Inbox → Queue → Mapper → Bitrix24 / CRM → Logs / Retry
Stack
Laravel PostgreSQL Redis Queue Vue / Inertia
Limits
  • Does not replace an enterprise-grade ESB/iPaaS
  • Each system is connected as a separate task
Audit · Ready to adapt

CRM Audit Pack

Adaptation time: from 1–7 days Cost: from 90,000 ₸

A ready diagnostics format: problem map, risks and a fix plan — before touching anything.

What problems it solves
  • Lead and deal duplicates
  • Robots and workflows misfire
  • Heavy REST requests
  • No logs or history
Who it is for
The CRM is unstable An old project without documentation Before a major rework
What's in the base version
  • Structure overview
  • Logs check
  • Risk search
  • Problem map
  • Risk table
  • Fix plan
What can be adapted
Audit depth Fix support hourly/by package
Architecture
Logs + DB + Business Process + Timeline → Diagnosis → Risk Map → Fix Plan
Stack
Bitrix24 D7 PHP SQL Logs
Limits
  • Fixes are a separate stage
  • Without access to logs/code, accuracy is lower
Logs / monitoring · Working skeleton

Webhook Inbox / Logger

Adaptation time: from 3–7 business days Cost: from 120,000 ₸

See every incoming event: payload, signature, processing status and error — with manual retry.

What problems it solves
  • Unclear whether an event arrived
  • No payload to investigate
  • The error is not visible
  • Cannot resend
Who it is for
There are incoming webhooks from external systems You need to understand why something "did not arrive"
What's in the base version
  • Receiving webhooks
  • Storing payload
  • Signature check
  • Processing status
  • Errors
  • Manual retry
What can be adapted
Event sources Processing rules Linking to tasks
Architecture
External source → Webhook Inbox → Signature check → Queue → Processing → Logs
Stack
Laravel PostgreSQL Queue
Limits
  • Built on top of Integration Hub
  • Processing is set up separately for each source
Cabinets · Ready to adapt

Laravel Client Cabinet

Adaptation time: from 2–4 weeks Cost: from 300,000 ₸

A ready external cabinet skeleton on Laravel that adapts to your processes and CRM.

What problems it solves
  • Clients cannot see statuses and data themselves
  • Support is overloaded with repetitive questions
  • Requests and messages get lost in email/messengers
Who it is for
Businesses that need an external product for clients Service companies Companies with client self-service
What's in the base version
  • Authentication and roles
  • Requests and statuses
  • Messages
  • Documents and invoices
  • Notifications
  • CRM integration
  • Admin panel
What can be adapted
Branding and request fields Extra modules Integration with your CRM/billing
Architecture
Client → Cabinet (Laravel) → API → CRM / Billing / Documents / Messages
Stack
Laravel Vue / Inertia PostgreSQL Redis Queue
Limits
  • Not a licensed SaaS — it is an adaptable base
  • Complex custom modules are estimated separately
Cabinets · Working skeleton

Bitrix24 Client Cabinet

Adaptation time: from 2–4 weeks Cost: from 280,000 ₸

A client cabinet on top of Bitrix24 data — when the CRM already stores everything needed.

What problems it solves
  • Clients have nowhere to see CRM statuses
  • Managers forward data manually
Who it is for
Companies on Bitrix24 Businesses whose data already lives in the CRM
What's in the base version
  • Request statuses
  • Inquiries
  • Invoices
  • Messages
  • Connection to CRM data
What can be adapted
Set of fields and sections Integration with external services Brand design
Architecture
Client → Cabinet (Bitrix24) → D7 / REST → Portal CRM data
Stack
Bitrix24 D7 HL blocks REST / OpenLines
Limits
  • Depends on the Bitrix24 edition and access
  • Heavy logic is moved to D7 separately
Cabinets · On request

Employee cabinet

Adaptation time: to be discussed Cost: on request

An internal cabinet for your processes — designed on request.

What problems it solves
  • Employees work in scattered spreadsheets
  • No single point for tasks and requests
Who it is for
Teams with internal processes Distributed departments
What's in the base version
  • Authentication and roles
  • Tasks / requests
  • Access to process data
What can be adapted
To the company's specific process
Architecture
Employee → Cabinet → API → Internal data / CRM
Stack
Laravel Vue / Inertia
Limits
  • Designed for the task — requires scoping
Cabinets · On request

Partner cabinet

Adaptation time: to be discussed Cost: on request

A portal for partners and dealers — tailored to your model, on request.

What problems it solves
  • Partners cannot see request statuses
  • Documents and calculations are handled manually
Who it is for
Dealer and partner networks Companies with external agents
What's in the base version
  • Partner authentication
  • Requests and statuses
  • Documents
  • Calculations
What can be adapted
To the partner model and terms
Architecture
Partner → Cabinet → API → CRM / Documents
Stack
Laravel Vue / Inertia
Limits
  • Designed for the partner model

Examples of tasks I have solved

Without disclosing clients: problem, approach and operational result

Click a card to open the full description

Automotive marketplace, NDA

Bank credit applications straight from the deal

Problem: The credit application lived outside the CRM: the manager re-entered client and vehicle data by hand, and the bank's decision was not visible in the deal — it was chased...

What I did: A "Credit applications" smart process with 21 result fields and role-based permissions: a manager sees their own applications, a head of department se...

Result: The module has been in production since August 10, 2026, on the broker's live environment since September 8, and client SMS have been going out since August 31. 192 CLI checks cover the offl...

PHP 8.3, Bitrix24 D7, smart processes, ORM, financial broker... rolled out in stages
Learn more →
Online school, NDA

A webinar funnel without dragging deals by hand

Problem: The online school runs multi-day webinars, and managers moved participants' deal stages by hand: who attended, who did not, who to invite to the broadcast. The previous C...

What I did: Intake of Bizon365 attendance reports: by broadcast day, a deal moves only forward by stage weights and never rolls back

Result: Broadcast invitations reached 628 of 628 participants with no errors, 451 of 451 deals were moved to "Did not attend", and a backlog of 396 deals was cleared; attendee protection filtered ou...

PHP 8, Bitrix24 REST (cloud), Bizon365 webhooks, ChatApp (Wh... about 3 weeks
Learn more →
Law firm, NDA

Recovering case documents: "files keep disappearing from deals"

Problem: Lawyers complained that documents were disappearing from cases. The cause turned out to be the robots of three smart processes: each named the case folder on the Shared D...

What I did: Read-only discovery: the folder pool, classification of every link from the cards (working, via shortener, old portal, empty, junk), orphan folders

Result: Discovery found 334 folders, 16 duplicate groups and 298 fixable shortener links. The live run processed 750 items: 2,544 files copied, 302 links repaired, 250 folder ids filled — 0 errors;...

PHP 8, Bitrix24 D7 (Disk, CRM Factory), CLI, Bash pipeline,... about a week
Learn more →
Financial company, NDA

Boxed Bitrix24 security and an audit trail for regulatory requirements

Problem: The financial company's boxed Bitrix24 had been accumulating scripts for years: some of them handed out an administrator session on an anonymous request, the API let requ...

What I did: Closed 6 places that issued an admin session on an anonymous request and an authorization bypass in 6 API endpoints; stack traces removed from respons...

Result: Accumulated logs were archived: 6,344 files totaling 2,041 MB compressed into a 120 MB archive with checksums, and the local/ directory shrank from 2.6 GB to 578 MB. Critical access holes ar...

PHP 8, Bitrix24 D7, .env, RSA-OAEP (WebCrypto), syslog, cron... about a month
Learn more →
Insurance company, NDA

A help desk on a Bitrix24 smart process: a service catalog and SLA based on old desk data

Problem: The previous OSTicket help desk gave no way to manage the service: 60% of 21,412 records over 6 years were automatic monitoring emails, everything was sorted into 5 categ...

What I did: Analyzed the OSTicket export: separated out monitoring, counted frequencies by topic — and built a two-level catalog of 11 areas and 32 services from...

Result: Instead of five categories and one deadline for everything — a catalog based on actual demand, per-service targets (from 15/60 minutes for a password reset to 480/4,800 for portal developmen...

PHP 8.4, Bitrix24 D7, smart processes, Lists, agents, Vue, P... rolled out in stages
Learn more →
Business center network, NDA

Floor plans and occupancy analytics for a business center network

Problem: The management company behind a network of business centers showed vacant space as a price list and verbal description — no floor-by-floor visualization, and occupancy ac...

What I did: An embeddable interactive floor-plan builder — a public iframe/JS widget with no Bitrix auth (CSP/CORS configured for embedding from external domains)

Result: Across the network: 93 floors, 1,087 offices and 152 uploaded floor plans — with occupancy that updates from the CRM automatically instead of being reconciled by hand for every site.

Bitrix24 (catalog, cron), PHP, embeddable JS widget 4–8 weeks
Learn more →
Financial company, NDA

Auto-dialing "stuck" online applications with a voice robot

Problem: Clients started an online application and stopped at one of the steps — registration, income, car details, signing. Managers could not call everyone by hand, and sending...

What I did: A cron job every 15 minutes selects deals idle for 30+ minutes using the stock stage history: a stage change resets the timer

Result: Stuck applications go to the robot automatically, without manual calling, and a client never gets two calls for different cards. Every run logs the skip reason for each card.

PHP 8, Bitrix24 D7 and REST, CRM stage history, voice robot... rolled out in stages
Learn more →
Automotive marketplace, NDA

A custom BI dashboard on top of Bitrix24

Problem: At an automotive marketplace, management and the call center needed a single "inquiry to visit to sale" funnel on top of Bitrix24 — the CRM's built-in reports did not cov...

What I did: 20 parameterized SQL reports on top of live CRM data with safely substituted filters

Result: Management, the call center, heads of sales and marketing got a set of dashboards on live CRM data instead of Excel exports: funnel, dealership, marketing — with a shared cache, click-throug...

PHP, Bitrix24 D7, SQL reports, TTL cache, whitelisted AJAX 4–6 weeks
Learn more →

Have a similar problem? Show an example — I will tell you how I would start the diagnostics.

Integrations · Bitrix24 · credit applications

Bank credit applications straight from the deal

Stack: PHP 8.3, Bitrix24 D7, smart processes, ORM, financial broker REST API, carrier SMS gateway, business processes, cron Timeline: rolled out in stages Client: Automotive marketplace, NDA

The credit application lived outside the CRM: the manager re-entered client and vehicle data by hand, and the bank's decision was not visible in the deal — it was chased by phone. From the deal alone, there was no telling where the application stood or why it was declined.

Constraints

The exchange runs through a financial broker whose actual callback format differed from the spec; the bank has its own status dictionary, and credit products have amount and term limits. Once the contract is approved, an application can no longer be submitted.

What I did
  • A "Credit applications" smart process with 21 result fields and role-based permissions: a manager sees their own applications, a head of department sees their department, an admin sees everything
  • Submission to the broker from the deal card: a draft, checks of required fields and product limits, a block on submitting after contract approval, and double-click protection
  • Callback intake: key-based authorization, idempotency by eventId, tolerant body parsing — callbacks had silently failed to save for 5 days because of a mismatch with the spec; found and fixed
  • A bank status dictionary — 28 business statuses and 16 technical ones; a final decision creates an activity for the manager and is written to the deal timeline
  • An SMS to the client with a link to the bank questionnaire under a "one application — one SMS" rule, with delivery-report intake
  • An exchange log across 6 directions, a "Submit application" business-process robot, and a morning watchdog for applications with no events for over 3 days
Architecture
Deal card → Validation and smart process → Financial broker API → Callbacks and bank statuses → SMS and a manager activity
Result

The module has been in production since August 10, 2026, on the broker's live environment since September 8, and client SMS have been going out since August 31. 192 CLI checks cover the offline logic, and every exchange event is visible in the log and on the deal timeline.

What can be reused
Callback receiver with a key, idempotency and tolerant body parsing Exchange log with personal-data masking Cron watchdog for "stuck" applications
Integrations · Bizon365 · WhatsApp · webinar funnel

A webinar funnel without dragging deals by hand

Stack: PHP 8, Bitrix24 REST (cloud), Bizon365 webhooks, ChatApp (WhatsApp), cron, flock, offline tests Timeline: about 3 weeks Client: Online school, NDA

The online school runs multi-day webinars, and managers moved participants' deal stages by hand: who attended, who did not, who to invite to the broadcast. The previous ChatApp integration had spawned ~1,470 extra deals and 261 extra contacts in two days.

Constraints

A live cloud portal with robots and mailings on stages — any mass move immediately sends messages to real people. REST silently ignores some filters and limits execution time, and the server and the portal live in different time zones.

What I did
  • Intake of Bizon365 attendance reports: by broadcast day, a deal moves only forward by stage weights and never rolls back
  • A separate branch for case-study webinars — a task for the owner instead of a new deal, idempotency by an event sha256 key and a dry_run mode with zero writes
  • Moving no-shows to "Did not attend" in batches: writes only with --execute, protection against repeated and parallel runs, protection for those who attended the broadcast
  • An invitation 10 minutes before the broadcast via a trigger stage, returning the deal to its original stage; course buyers are excluded from the mailing
  • Joining a WhatsApp chat via ChatApp moves the deal to the right stage — through a file queue with flock instead of creating new deals
  • A REST wrapper that never reports errors as success and waits on its own until the portal allows requests again
Architecture
Bizon365 / ChatApp → Webhooks and queue → Stage rules → Cron scripts with --execute → Bitrix24 REST
Result

Broadcast invitations reached 628 of 628 participants with no errors, 451 of 451 deals were moved to "Did not attend", and a backlog of 396 deals was cleared; attendee protection filtered out 65 of 78 deals. A contact audit found 564 cards with a phone number in the "Name" field — the source of undeletable duplicates.

What can be reused
"Forward-only" deal movement by stage weights Mass-operation CLI scripts: dry-run by default, writes only with --execute Bitrix24 REST wrapper with honest error handling and rate-limit waiting
CRM / Bitrix24 · Drive · data recovery

Recovering case documents: "files keep disappearing from deals"

Stack: PHP 8, Bitrix24 D7 (Disk, CRM Factory), CLI, Bash pipeline, cron Timeline: about a week Client: Law firm, NDA

Lawyers complained that documents were disappearing from cases. The cause turned out to be the robots of three smart processes: each named the case folder on the Shared Drive its own way and created a new one whenever the case was renamed — the old folder with the documents was left with no link from the card.

Constraints

Nothing could be deleted: these are working documents in court cases. Some links went through an external URL shortener or pointed to the old portal, some cases had their own folder containers, and ambiguous matches could only be resolved together with the lawyers.

What I did
  • Read-only discovery: the folder pool, classification of every link from the cards (working, via shortener, old portal, empty, junk), orphan folders
  • Merging duplicate folders with priority to the root case: contents move into the canonical folder, sources are not deleted, suspicious groups go to manual review
  • Syncing files from the card's file fields into the case folder without duplicates by name and size, repairing links and backfilling the service field with the folder id
  • Recreating missing folders for cases that had no working folder on the drive at all
  • A final one-command pipeline: three dry runs by default, a live run only with confirmation, stop on the first error; a nightly sync via cron
Architecture
Discovery (read-only) → Merging duplicates → Recreating folders → Syncing files and links → Nightly cron
Result

Discovery found 334 folders, 16 duplicate groups and 298 fixable shortener links. The live run processed 750 items: 2,544 files copied, 302 links repaired, 250 folder ids filled — 0 errors; a repeat check confirmed 7,182 files in place across 780 items.

What can be reused
Read-only discovery with link classification before any changes Merging duplicate folders without deleting sources A dry-run → confirmation → live run pipeline
Legacy · security · audit trail

Boxed Bitrix24 security and an audit trail for regulatory requirements

Stack: PHP 8, Bitrix24 D7, .env, RSA-OAEP (WebCrypto), syslog, cron, gzip, JavaScript Timeline: about a month Client: Financial company, NDA

The financial company's boxed Bitrix24 had been accumulating scripts for years: some of them handed out an administrator session on an anonymous request, the API let requests through without a token, credentials sat in the code, and logs with IINs and phone numbers piled up without rotation. Meanwhile, the financial regulator's audit-trail requirements were not being met.

Constraints

Production cannot stop, and dozens of integrations depend on the current behavior; auditing had to be enabled by flags with safe defaults, and personal data must end up neither in responses nor in logs.

What I did
  • Closed 6 places that issued an admin session on an anonymous request and an authorization bypass in 6 API endpoints; stack traces removed from responses
  • Anonymous endpoints got rate limiting, the IIN is validated before paid external calls; IDOR and CSRF closed in working interfaces
  • The login-form password is encrypted in the browser (RSA-OAEP, 4096-bit key); about 50 hardcoded credentials moved to .env
  • An audit trail behind flags: failed logins, an API call log, a syslog mirror; a daily watchdog for log rotation and for regressions of mandatory 2FA
  • The logger masks IINs, phones and cards; 90-day rotation plus a 400-day archive; false masking of hashes cut from 5.1% to 0% on 200,000 values
  • A log viewer with charts and cross-log search by request id; a health API catches error spikes against the median, silence and stalled rotation
Architecture
Portal and API entry points → Authorization, limits, CSRF → Logger with PII masking → Rotation and archive → Viewer and health API
Result

Accumulated logs were archived: 6,344 files totaling 2,041 MB compressed into a 120 MB archive with checksums, and the local/ directory shrank from 2.6 GB to 578 MB. Critical access holes are closed, and the logs show incidents rather than noise.

What can be reused
Logger with personal-data masking and hash protection Log rotation with archive and watchdog Log health API: spike vs. median and silence
CRM / Bitrix24 · help desk · service catalog · SLA

A help desk on a Bitrix24 smart process: a service catalog and SLA based on old desk data

Stack: PHP 8.4, Bitrix24 D7, smart processes, Lists, agents, Vue, PHPUnit, Vitest Timeline: rolled out in stages Client: Insurance company, NDA

The previous OSTicket help desk gave no way to manage the service: 60% of 21,412 records over 6 years were automatic monitoring emails, everything was sorted into 5 categories, 92% of real requests sat at Low priority, and the baseline 4-hour SLA was stretched by hand to match the actual closing time.

Constraints

The live flow is about 95 requests a month, so the catalog was built on actual request frequency rather than "the usual way". An administrator must be able to edit the catalog without a developer, and the SLA deadline must not be quietly stretched.

What I did
  • Analyzed the OSTicket export: separated out monitoring, counted frequencies by topic — and built a two-level catalog of 11 areas and 32 services from them, most frequent first
  • A service's clarifying questions are described by a JSON schema with dependent fields; the same validation rules on the server and in the browser are checked against shared test fixtures
  • Effective priority "service × urgency", response and resolution targets in working minutes; the original deadline is fixed at submission and cannot be stretched
  • Auto-assignment to the least-loaded assignee in the service group and an SLA control agent with notifications
  • One catalog-and-wizard engine serves 4 catalogs: help desk, HR processes, document workflow and development requests
Architecture
Request wizard on the portal → Service catalog (Lists) → JSON form schema → Requests smart process → SLA control agent
Result

Instead of five categories and one deadline for everything — a catalog based on actual demand, per-service targets (from 15/60 minutes for a password reset to 480/4,800 for portal development) and a deadline that cannot be moved unnoticed.

What can be reused
Service catalog with JSON-schema forms and shared browser/server validation SLA in working minutes with original-deadline protection Auto-assignment by assignee group workload
CRM / Bitrix24 · business center network

Floor plans and occupancy analytics for a business center network

Stack: Bitrix24 (catalog, cron), PHP, embeddable JS widget Timeline: 4–8 weeks Client: Business center network, NDA

The management company behind a network of business centers showed vacant space as a price list and verbal description — no floor-by-floor visualization, and occupancy across the network sites was not visible in one report.

Constraints

The widget has to embed on the external websites of network locations (including WordPress) without Bitrix authentication, while occupancy status still has to stay in sync with real CRM data.

What I did
  • An embeddable interactive floor-plan builder — a public iframe/JS widget with no Bitrix auth (CSP/CORS configured for embedding from external domains)
  • An internal admin panel for uploading and editing floor plans
  • Auto-sync of occupancy status, tenant name and lease end date from the CRM via cron — plan images are uploaded manually, occupancy data updates itself
  • Occupancy dashboards per site: percentage occupied by area (m²), office count, and revenue from occupied space
  • The widget is already embedded on external sites for network locations
Architecture
Bitrix24 (catalog, cron) → Public embed widget (CSP/CORS) → Floor-plan admin panel → Cron occupancy sync → Dashboards / gauges
Result

Across the network: 93 floors, 1,087 offices and 152 uploaded floor plans — with occupancy that updates from the CRM automatically instead of being reconciled by hand for every site.

What can be reused
Public embed widget with CSP/CORS for external site pages Cron-based occupancy sync from the Bitrix24 catalog without REST Occupancy-by-area (m²) dashboard with per-site revenue calculation
Integrations · Bitrix24 · voice robot

Auto-dialing "stuck" online applications with a voice robot

Stack: PHP 8, Bitrix24 D7 and REST, CRM stage history, voice robot REST API, webhook, cron, flock Timeline: rolled out in stages Client: Financial company, NDA

Clients started an online application and stopped at one of the steps — registration, income, car details, signing. Managers could not call everyone by hand, and sending everyone to the robot indiscriminately would mean repeat calls to the same person and calls to people who had already declined.

Constraints

The robot works in campaigns — one per application step; one client can have several cards; a repeated cron run must not produce a second call, and calls are allowed only in a daytime window.

What I did
  • A cron job every 15 minutes selects deals idle for 30+ minutes using the stock stage history: a stage change resets the timer
  • A pipeline stage map: each application step leads to its own robot campaign; final, rejection and service stages are never sent; calling window 08:00–21:00
  • "One client — one call": cards are grouped by phone, the most recent one goes to dialing, and a negative outcome removes all cards with that number from dialing
  • Three-layer idempotency: flock against parallel runs, order fields on the deal and a stable import_id on the robot side
  • The call-result webhook finds the deal, records the outcome without overwriting fields with empty values and starts a business process; there is a test mode on a separate campaign
  • Selection logic moved into pure functions without the Bitrix core and covered by 66 smoke checks
Architecture
CRM stage history → Cron: selection and dedup → Voice robot API → Result webhook → Deal and business process
Result

Stuck applications go to the robot automatically, without manual calling, and a client never gets two calls for different cards. Every run logs the skip reason for each card.

What can be reused
Selecting "stuck" deals by stage history Three-layer idempotency for sending to an external service Dialing deduplication by phone
CRM / Bitrix24 · BI dashboard

A custom BI dashboard on top of Bitrix24

Stack: PHP, Bitrix24 D7, SQL reports, TTL cache, whitelisted AJAX Timeline: 4–6 weeks Client: Automotive marketplace, NDA

At an automotive marketplace, management and the call center needed a single "inquiry to visit to sale" funnel on top of Bitrix24 — the CRM's built-in reports did not cover that view.

Constraints

Some classic call-center metrics (SL/ASA/ATA) simply cannot be computed without telephony data; mixing different date sources (lead vs. visit) skews percentages unless kept separate.

What I did
  • 20 parameterized SQL reports on top of live CRM data with safely substituted filters
  • A "lead to visit to deal to sale" funnel with intermediate metrics (contact rate, occupancy, etc.)
  • A multi-level TTL cache with stale fallback and locks — the dashboard never hits the CRM with heavy queries directly
  • 33 whitelisted AJAX actions with permission and session checks
  • Honest documentation of the limitations of every disputable metric instead of dressing up the numbers
  • A head-of-sales dashboard per dealership: metrics are calculated by the deal's own dealership, and any number expands into a list of deals with a click
  • A marketing dashboard by business line and traffic source; comparison with the same dates of the previous month on every page
  • A shared report cache with an access check before the cache: the first build takes 7.2 s, the next user gets it in 0 ms
  • A "who sees which report" access registry with the source of each grant, access granted without a deploy, and a unified navigation header across reports
Architecture
Live Bitrix24 data → SQL reports → Cache layer (live/cached/pre-aggregated) → Tabbed dashboard
Result

Management, the call center, heads of sales and marketing got a set of dashboards on live CRM data instead of Excel exports: funnel, dealership, marketing — with a shared cache, click-through drill-down on every number and clearly documented metric limitations. Access to 6 reports is managed from a single registry without a deploy.

What can be reused
Live/cached/pre-aggregated report provider layer TTL cache with stale fallback for heavy SQL reports Approach to honestly documenting metric limitations

Work format

Who does the work, how the process runs, and how pricing adds up.

Who does the work

I've worked with Bitrix24 for 5 years: from small fixes to operations automation for entire business centers and dealer networks. Below — real projects by date, who I fit, official paperwork and the stack I currently work with.

About →
How the work goes
  1. 01 Intro and audit
  2. 02 Timeline and cost estimate
  3. 03 Signing the contract
  4. 04 Prepayment
  5. 05 Development
  6. 06 Result demo
  7. 07 Final payment
  8. 08 Support
Process →
What it costs

A transparent hourly rate, ready-made packages for typical tasks and a monthly retainer. There is also a rough estimate calculator — the exact price is set after an audit.

Starter packages Retainer support Cost calculator
Pricing → How much does Bitrix24 cost: box and cloud →

Not sure where to start?

Just describe the problem. I will study the current solution, assess the risks and propose implementation options.

To estimate the task quickly, please send:
  1. what should work
  2. what does not work now
  3. a link / screenshot / example
  4. when the problem appeared
  5. whether there is access to logs
  6. what result you need

Get in touch

Pick a convenient channel — I reply fast.

Discuss a task

Describe the task — I will reply and propose a solution.

Additional (optional)

FAQ

Do you work under a contract?

Yes, officially as a sole proprietor: contract, invoice and closing documents.

Do you work with the Bitrix24 box (D7)?

Yes. I customize the boxed version: modules, business processes and direct integrations on D7.

Do you work with the Bitrix24 cloud?

Yes. For the cloud I build apps and integrations via REST API and webhooks.

Frequently solved problems

Data

The cause is almost never the people — it is that nobody protected the system from sloppy input and parallel edits. First I show the scale in numbers, then I fix the data, and only then close the hole the junk came through.

Symptoms
  • Lead and deal duplicates
  • Dirty phone numbers
  • Lost links
  • CRM and warehouse divergence
  • Outdated stock
How I work through it
  • Count duplicates and mismatches with queries: the number of affected records is visible before any fix
  • Normalize phone numbers, emails and key fields to a single format
  • Add a lookup for an existing record before a new one is created
  • Close the source: the form, import or integration that produced the junk
  • Leave a reconciliation you can re-run and see the result
Frequently solved problems

Processes

A stuck business process almost never "crashes" — it quietly waits for a condition that will never come. I find which step stalls and why, then move the fragile logic somewhere it is visible and fixable.

Symptoms
  • Robots do not fire
  • Business processes hang
  • Approvals are manual
  • No deadline control
  • Managers bypass the CRM
How I work through it
  • Find which step processes stall at and on which condition
  • Compare what should trigger a robot with what actually triggers it
  • Move fragile logic out of the visual builder into code with logs
  • Add deadline control and notifications for the people responsible
  • Remove the manual steps that make managers bypass the CRM
Frequently solved problems

Integrations

An integration without logs is a black box: you cannot even tell whether an exchange was attempted. First I make the exchange visible, and only then do we discuss what to fix in it.

Symptoms
  • No logs
  • No retry
  • API fails
  • Data arrives partially
  • The error is not visible to the user
How I work through it
  • Turn on logging of incoming and outgoing requests, with tokens masked
  • Add delayed retries for temporary errors on the other side
  • Separate "no data arrived" from "data arrived partially" — different failures
  • Surface the error where a person will see it, not only the server
  • Leave a verify mode: run the exchange without writing to the live database