A security company loses up to 30% of leads due to an unrealistic calculator: the client enters the area, but the system ignores the number of posts and operating mode — the total cost diverges from reality. Standard CMS solutions cannot handle the load: when simultaneously loading a list of objects, an N+1 query leads to a page load time over 5 seconds. We use Next.js with server-side rendering (SSR) and data caching, reducing TTFB to 200 ms. The client cabinet is built on incremental static regeneration (ISR) — object information updates every 60 seconds without a full reload. Client data is protected: HTTPS, encryption at every stage, two-factor authentication. Integration with the console via WebSocket ensures alarm reception within 2 seconds.
What services and licenses to display on the site?
A security company website is a B2B sales tool. Focus on trust. Be sure to include:
- Services: physical security of facilities, VIP events, remote monitoring, installation of security systems (video surveillance, access control, fire alarm), panic button. Each service — a separate page with description, benefits, and a quote request form.
- Licenses: scans of private security company licenses with QR code for verification on the Ministry of Internal Affairs website. ISO and FSB certificates if available.
- Case studies: description of objects (type, task, solution, result) without addresses and names. Clients are more willing to subscribe if they see experience.
An interactive calculator converts 40% more leads than a static price list. It considers the type of object, area, number of posts, and operating mode — provides an estimated cost. Below the calculator — a form to request a detailed quote.
How does the client cabinet automate service?
For remote monitoring clients, we implement a cabinet with functions:
- Real-time object status (armed/disarmed).
- Alarm history: time, description, response time, actions taken.
- Current contract and certificates of completion.
- Payments and payment history.
- Adding/removing responsible persons.
Thanks to ISR, the cabinet page loads 60% faster than with classic rendering. Data comes through the API of the central monitoring station (PCO). We integrate with any software — from popular to custom solutions.
Why is integration with PCO critical for trust?
A panic button is not just an icon on the website. We implement a mobile app or web button: upon pressing, GPS coordinates are transmitted, the signal goes to the dispatcher's tablet via WebSocket with a push notification. The panic button via WebSocket reacts 5 times faster than an HTTP request. Response time is reduced to 2 seconds.
"Thanks to PCO integration via WebSocket, we receive an alarm signal in 2 seconds, allowing us to arrive at the site 15 minutes faster." — engineer at a security company.
Comparison of basic and extended solution
| Component |
Basic Portal |
Extended Portal |
| Service pages |
+ |
+ |
| Licenses and cases |
+ |
+ |
| Application form |
+ |
+ |
| Cost calculator |
static |
interactive |
| Client cabinet |
— |
+ |
| PCO integration |
— |
+ |
| Panic button |
— |
+ |
| SEO optimization |
basic |
advanced |
Development stages for the extended portal
| Stage |
Content |
Duration |
| Analytics |
Client interview, requirements gathering, audit of current systems |
1 week |
| Prototyping |
UX diagrams, structure approval |
1 week |
| Design |
UI mockups in Figma, mobile responsiveness |
2 weeks |
| Frontend |
React/Next.js, TypeScript, Tailwind, SSR for pages |
4 weeks |
| Backend |
Laravel/Node.js, REST API, PCO integration |
4 weeks |
| Integration |
WebSocket for panic button, data synchronization |
2 weeks |
| Testing |
Load testing, security check |
1 week |
| Deployment |
CI/CD setup, SSL certificate, documentation |
1 week |
Work process
- Analytics: study business processes, identify bottlenecks of the current site.
- Design: create a prototype, approve with you.
- Design: draw a modern interface in corporate style.
- Development: write code on a modern stack (Next.js, Laravel, WebSocket).
- Integration: connect the PCO via WebSocket or REST API.
- Testing: check load (100+ concurrent requests) and security.
- Launch: deploy on your hosting, hand over access and documentation.
Typical mistakes in security company website development
- Unused dynamic content: loading all objects at once instead of pagination — leads to N+1 query. Solution: use ISR and pagination on the backend.
- Lack of caching: every request to the PCO loads the database. Caching via Redis reduces load by 10 times.
- Weak API protection: open endpoints for the panic button. We use HMAC signature and rate limiting.
Timelines and pricing
Basic site (services, licenses, application form) — from 2 to 3 weeks. Extended portal (with cabinet, PCO integration, panic button) — from 2 to 3 months. Pricing is calculated individually based on your requirements. We provide a warranty on work up to 12 months.
Contact us for a free consultation and project assessment. Order a turnkey portal development — get a ready tool for growing B2B sales and automating client service.
Development of Corporate Portals and Internal Systems
We specialize in developing corporate portals — CRM, ERP, LMS, and Intranet. Each project starts not with landing page layout, but with how business rules will be embedded into the architecture: who sees which data, how 1C and accounting systems sync, how 500 contacts turn into 500,000 without performance degradation. Over 7 years, we have delivered over 40 portals for companies with 50 to 5000 employees. We will evaluate your project in two business days — just contact us.
A public website can be launched without detailed design — iteratively improved based on feedback. With a corporate portal, this approach does not work: the cost of fixing architectural decisions after launch for 200 users is incomparably higher. Therefore, we spend 70% of our time on analysis and prototyping, and write code only after the role matrix and integration scheme are approved.
Three areas where bad decisions are often made: access rights model, performance on large data, and real-time updates.
How to build a role model for 30 departments?
Access rights model. "A manager sees only their own clients, a department head sees the entire department, a director sees the whole company, but financial data is visible only to the CFO and above." This is not three roles — it's a matrix of roles, permissions, organizational units, and record ownership. Implementing it with if ($user->role === 'manager') in controllers will make the code unmaintainable after six months.
The correct approach: Spatie Laravel Permission for basic role model + Policy classes for object-level permission (can('view', $deal) checks not only the role but also ownership). For complex hierarchical structures — ABAC (Attribute-Based Access Control) instead of RBAC.
Performance on large data. CRM with 500,000 contacts, filtering by 10 fields, sorting by activity — a naive implementation yields 15-second queries. Composite indexes, denormalization of aggregates (last_activity_at on the record itself instead of MAX over related table), Elasticsearch for full-text search on contacts.
Real-time updates. Multiple employees working on the same document or task. Without WebSocket — constant setInterval with polling every 5 seconds, extra server load, update delays. Laravel Broadcasting + Pusher/Soketi or a custom WebSocket server on Node.js — for notifications and real-time changes.
CRM Systems
Typical set: contacts, companies, deals, activities, sales funnel, reports. Technically straightforward. The complexity lies in the details.
Pipeline with custom stages. Every company wants its own funnel. Stages must be configurable without deployment. Table pipeline_stages with position, color, is_final, probability — and drag-and-drop for reordering on UI (React DnD or dnd-kit).
Change history. Who and when changed a deal status, reassigned a responsible person, added a note. Audit log via Observer or spatie/laravel-activitylog. On UI — timeline with filtering by activity type.
Email integration. IMAP/SMTP for connecting corporate mailbox, automatic linking of incoming emails to contacts by email address. This works reliably only with proper handling of bounces, spam, auto-replies — filtering is required.
Why is ERP not about code but about data?
ERP is when CRM, warehouse, production, accounting, and HR are unified into a single system. Full ERP from scratch is rare (usually integrating with existing systems), but modular systems for specific businesses are common.
Key principle: financial operations must be immutable. Not UPDATE orders SET status = 'cancelled' — but creating a new record order_cancellations with a reference to the original order. This is the immutable ledger principle, which simplifies auditing and reconciliation.
Integration with 1C is almost always part of an ERP project. Two-way synchronization: from 1C to portal (directories, balances, prices) and from portal to 1C (orders, documents). RabbitMQ as an event bus between systems is more reliable than direct HTTP interaction — if 1C is unavailable, messages wait in the queue.
How are LMS structured: learning platforms?
Learning Management System — courses, modules, lessons, tests, certificates, user progress.
Video content is the most demanding part of an LMS. Storing video on your own server and serving via Nginx is a bad idea: expensive, slow, no adaptive bitrate. Correct approach: upload to S3/Cloudflare R2, transcode via AWS Elemental MediaConvert or Mux, HLS playlist for adaptive streaming via Video.js or Plyr.
Viewing progress — periodic sending of watch_position from the frontend (every 10–30 seconds), storage in Redis with periodic synchronization to PostgreSQL. Do not save every second to the database — it will kill performance.
SCORM compatibility — if integration with corporate training materials is needed. Separate module, there are ready libraries (scorm-again).
Intranet and HR Portals
Corporate intranet: news, documents, organizational structure, HR processes (vacations, requests, KPIs).
Organizational structure in the database is a hierarchical structure. Adjacency list (parent_id on each record) is simple to implement but slow for recursive queries. Nested Sets or Closure Table are faster for reading hierarchies, more complex for changes. In PostgreSQL — recursive CTEs (WITH RECURSIVE) with adjacency list — a balance between simplicity and performance.
Document and request approval — workflow engine. Simple linear approvals (employee → manager → HR → accountant) can be done without a special engine. Non-linear (parallel branches, conditional transitions, delegation) — consider ready solutions: Temporal.io for workflow orchestration or a custom state machine based on the state-machine pattern.
What is included in the work
When ordering a corporate portal development, you receive:
- Architectural documentation (ER diagrams, integration scheme, role matrix)
- Full code in a Git repository with CI/CD
- Access to infrastructure (hosting, databases, storage)
- Training for administrators and key users (2–3 sessions)
- Warranty support for 3 months after launch
Our design principles rely on official Laravel documentation on authorization (Policies) and recommendations for working with queues.
Technical Stack for Portals
| Layer |
Tools |
| Backend |
Laravel + PostgreSQL |
| Frontend |
React + TypeScript (Inertia.js or separate SPA) |
| Real-time |
Laravel Echo + Soketi / Pusher |
| Search |
Meilisearch (quick start) or Elasticsearch (volume) |
| Queues |
Laravel Queue + Redis |
| Files |
S3-compatible (MinIO self-hosted or AWS S3) |
| Monitoring |
Sentry + Telescope (dev) |
Timeline Estimates
| Portal Type |
Timeline |
| CRM (basic) |
10–16 weeks |
| LMS (courses + video + tests) |
14–22 weeks |
| HR Portal (vacations, KPIs, org structure) |
12–20 weeks |
| Corporate ERP (modular) |
24–52 weeks |
The cost is calculated individually after a detailed analysis of requirements and role model. To get a preliminary estimate, contact us — we will analyze your task and offer an optimal turnkey solution.