Headless-frontend on Vue.js for 1C-Bitrix: turnkey development

Our company is engaged in the development, support and maintenance of Bitrix and Bitrix24 solutions of any complexity. From simple one-page sites to complex online stores, CRM systems with 1C and telephony integration. The experience of developers is confirmed by certificates from the vendor.
Showing 1 of 1All 1626 services
Headless-frontend on Vue.js for 1C-Bitrix: turnkey development
Medium
~1-2 weeks
Frequently Asked Questions

Our competencies:

Development stages

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1356
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Website development for FIXPER company
    943
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Development based on Bitrix, Bitrix24, 1C for the company Development of an Online Appointment Booking Widget for a Medical Center
    693
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Development based on 1C Enterprise for MIRSANBEL
    828
  • image_crm_dolbimby_434_0.webp
    Website development on CRM Bitrix24 for DOLBIMBY
    731
  • image_crm_technotorgcomplex_453_0.webp
    Development based on Bitrix24 for the company TECHNOTORGKOMPLEKS
    1073

Typical situation: a designer created a catalog with animated filters, instant cart updates, and page transitions without reload. The frontend developer looks at the bitrix:catalog.section and bitrix:sale.order.ajax templates and realizes that fitting this into the standard Bitrix component model is impossible without crutches. That's where headless approach comes in: Bitrix remains the backend, and the entire interface lives on Vue.js. This isn't a trendy stack for the sake of fashion. Headless is justified when standard Bitrix templates cannot deliver the required UX, when the frontend team works independently from backend developers, or when one API serves the website, mobile app, and kiosks in offline locations. We have been using this approach for over 5 years and have implemented more than 20 projects — from small catalogs to B2B portals with tens of thousands of products. Experience shows that with proper architecture, headless delivers modern UX and high performance, with a 12-month warranty on the work.

Why headless on Bitrix is a justified solution?

For projects where the standard Bitrix interface does not meet requirements for animation, transition speed, or the need to work on mobile devices with JavaScript disabled (SSR). Headless also allows separating teams: frontend developers work with Vue, backend with Bitrix, and the contract is an API specification. Additionally, this approach naturally paves the way for multi-platform — one API serves the website, app, and kiosks. The ROI for headless is about 6–12 months, thanks to up to 30% reduction in frontend maintenance costs.

Architecture: how layers are separated

In a classic Bitrix store, a PHP component fetches data, passes an array to template.php, where CSS and JS are also included. In the headless scheme, everything is different:

  • Bitrix operates as an API server. Catalog, prices, stock, cart, checkout, authorization — all via REST API (module rest) or custom controllers based on \Bitrix\Main\Engine\Controller.
  • Vue.js / Nuxt.js — a separate application. Renders the interface, manages routing, state, forms.
  • Nginx proxies: /api/* goes to Bitrix, the rest goes to Vue static or Node.js (with SSR).

Frontend and backend deployments are independent. The frontend developer pushes to their repository, CI builds the bundle, deploys to CDN or Node server. The backend updates Bitrix separately. The contract between them is the API specification.

Parameter Classic Bitrix Headless (Vue + Bitrix)
Rendering Server-side (PHP) Client-side + CSR/SSR
Caching Composite cache ISR, CDN, Service Worker
Development Tied to templates Independent
Indexing Out of the box Requires SSR
UI Flexibility Limited by components Maximum

Bitrix REST API: what works and what needs to be supplemented

The rest module provides methods for main store entities:

  • catalog.product.list — products with filtering by properties, sections, prices
  • catalog.product.get — detailed card
  • catalog.product.offer.list — trade offers (SKUs)
  • catalog.section.list — category tree
  • catalog.price.list — prices by type
  • sale.basket.addItem, sale.basket.updateItem, sale.basket.deleteItem, sale.basket.getItems
  • sale.order.add, sale.order.get, sale.order.list
  • sale.shipment.getDeliveryServices, sale.paySystem.getList

On paper, everything is covered. In practice, nuances appear. catalog.product.list does not return arbitrary infoblock properties. You need to additionally request via catalog.product.getFieldsByFilter or write your own endpoint. Faceted filtering — counting the number of products for each filter value, as in the standard smart_filter — is absent in the REST API. Calculating delivery cost based on cart contents is another method missing out of the box.

The solution is custom REST methods. They are registered via \CRestServer::onRestServiceBuildDescription() or via \Bitrix\Main\Engine\Controller with the @restMethod annotation. On the Bitrix side, the custom controller performs the query and returns JSON:

  • /api/catalog/filter — products + facets (counts per filter value)
  • /api/cart/calculate — cart recalculation considering cart rules, discounts, and promo codes
  • /api/checkout/submit — checkout in one request

Facet index is a separate story. Bitrix stores precomputed facets in the b_catalog_smart_filter table. In a headless approach, you either use this table directly via ORM or build facets on the fly. The first option is faster but ties you to Bitrix's internal structure. The second is slower on large catalogs (50,000+ products) but predictable. According to Wikipedia, REST is an architectural style for interaction between components of a distributed application over a network.

Technical details for senior developers For optimizing large catalogs, it is recommended to use HL blocks for storing additional properties and tagged caching. For example, when updating a product price via an agent, you can invalidate only the tagged cache without affecting other pages. Agents and events (`OnAdminListDisplay`, `OnSaleOrderSaved`) help synchronize data between Bitrix and external services like CDEK or YooKassa.

Component architecture of the Vue application

The frontend structure for an online store:

src/
├── pages/
│   ├── CatalogPage.vue        # product list with filters
│   ├── ProductPage.vue         # product card
│   ├── CartPage.vue            # cart
│   ├── CheckoutPage.vue        # checkout
│   └── AccountPage.vue         # personal account
├── components/
│   ├── catalog/
│   │   ├── ProductCard.vue
│   │   ├── FilterPanel.vue
│   │   └── FacetCounter.vue
│   ├── cart/
│   │   ├── CartItem.vue
│   │   └── CartSummary.vue
│   └── ui/                     # reusable elements
├── stores/
│   ├── catalogStore.ts         # Pinia: products, filters, pagination
│   ├── cartStore.ts            # cart, API synchronization
│   ├── userStore.ts            # authorization, token
│   └── checkoutStore.ts        # checkout
├── api/
│   ├── catalog.ts              # wrappers over catalog API
│   ├── cart.ts
│   └── auth.ts
└── composables/
    ├── useProductFilter.ts     # filtering logic
    └── useInfiniteScroll.ts    # infinite scroll

Pinia manages state. cartStore is the most non-trivial: when adding a product, you need to instantly update the UI (optimistic update), send a request to the API, get a response with the actual price (Bitrix may have applied a discount or deducted stock) and synchronize local state with the server. For unauthorized users, the cart lives in localStorage and migrates to the server after login. Vue Router with lazy loading: each page is a separate chunk. Transitions between categories do not reload the app, and filters are written to URL query parameters for shareable links.

How to set up SSR for indexing?

A Vue SPA renders on the client. A search bot sees an empty <div id="app"></div>. For an online store where product cards and categories must be indexed, this is a death sentence.

Nuxt.js with SSR is the main option. A Node.js server renders Vue components into HTML; data from the Bitrix API is fetched via useFetch() or useAsyncData(). The client receives ready HTML; after hydration, the app works as an SPA. Using SSR reduces time to first paint by 40–60%.

Nuxt.js with ISR (Incremental Static Regeneration) is a hybrid approach. Catalog pages are cached and updated based on TTL or a webhook from Bitrix when a product changes. Nuxt 3 supports routeRules with swr (stale-while-revalidate):

// nuxt.config.ts
routeRules: {
  '/catalog/**': { swr: 3600 },   // cache for an hour
  '/product/**': { swr: 600 },     // cache for 10 minutes
  '/cart': { ssr: false },          // cart — client only
  '/checkout': { ssr: false },
}

For catalogs with 50,000+ products, SSR is preferable to full static generation — nuxt generate for such a volume would take hours. Meta tags are a separate task. In Bitrix, SEO templates are configured in infoblock properties (templates like {=this.Name} buy in Minsk). In a headless approach, these templates need to be served via API and applied in Nuxt using useHead() or useSeoMeta().

Authorization: two approaches

OAuth 2.0 via the rest module: the frontend redirects to /oauth/authorize/, the user logs in on the Bitrix side, receives a code, exchanges it for an access_token. Standard flow, but UX suffers — redirect to another domain.

Custom JWT endpoint: /api/auth/login accepts login/password, Bitrix verifies via CUser::Login(), creates a session and returns a JWT. The frontend stores the token in an httpOnly cookie (not in localStorage — otherwise XSS vulnerability). A refresh token extends the session without re-entering password. Simpler to implement, better UX.

What is lost with headless?

  • Visual editor — does not work. Content is managed through the Bitrix admin panel; the frontend fetches data via API.
  • Composite cache — not applicable. Caching on the Nuxt side (ISR) or CDN.
  • Standard components — bitrix:catalog.section, bitrix:sale.order.ajax are not used. All display logic is on Vue.
  • Exchange with 1C — works unchanged, as it's server-side.

What stages does development include?

  1. Analysis — we study the current Bitrix architecture, UX and performance requirements, determine the list of custom API methods.
  2. Design — we develop an API specification (OpenAPI), a UI prototype, and agree with you.
  3. Development — we write custom REST methods, the Vue application, configure SSR, integrate with external services.
  4. Testing — load testing (with k6 or Artillery), SEO meta tag verification, cross-browser compatibility.
  5. Deployment — CI/CD setup, production deployment, monitoring.

What is included in the work?

  • Complete API specification (OpenAPI) for all custom methods.
  • Source code of the Vue application with comments.
  • Deployment and CI/CD setup instructions.
  • Automated tests for critical scenarios.
  • Training your team to work with the headless architecture.
  • 1 month of technical support after launch.

Timelines by project scale:

Scope What's included Timeline
MVP catalog Listing, product card, filters, SSR 1–2 weeks
Store without account + cart, checkout, payment 3–4 weeks
Full-fledged store + account, order history, favorites, compare 5–8 weeks
B2B portal + price types by group, personal catalogs, quick order 8–12 weeks

Headless on Bitrix is a trade-off. Modern frontend and flexibility in exchange for losing part of the ecosystem and increased support costs. The approach is justified for projects with high interface requirements, a dedicated frontend team, and plans for multi-platform. Switching to headless can reduce frontend maintenance costs by up to 30% due to team independence. To evaluate your project, contact us and we will prepare a commercial proposal with exact timelines and cost. Request a consultation on headless development for your online store.

Why is 1C-Bitrix the flagship of e-commerce?

A faceted index on a catalog of 200,000 SKUs is not built — bitrix:catalog.smart.filter takes 4 seconds instead of 200 ms, and the customer leaves. Our online store development on 1C-Bitrix eliminates such scenarios: from infoblock architecture and price types to cluster balancing under peak loads. With over 12 years of experience and 200+ completed e-commerce projects, we have solved every performance bottleneck.

Two-way synchronization with 1C via CommerceML — catalog, prices, balances, orders, and statuses. Configured from the admin panel via the catalog module -> 'Exchange with 1C'. Export to marketplaces via YML feeds (catalog.export) for Yandex.Market, Google Shopping, Ozon, Wildberries. According to Wikipedia, 1C-Bitrix is used by more than 70,000 commercial sites in Russia and the CIS (https://en.wikipedia.org/wiki/1C-Bitrix). Contact us to evaluate your current architecture.

How do we solve key performance problems?

bitrix:catalog.smart.filter without faceted index generates queries that bring down MySQL. Solution: build b_catalog_iblock_index — response time drops from 4 seconds to 100–200 ms. For SEO filters, we use catalog.seo.filter — indexable filter intersection pages with unique meta tags.

Composite cache (bitrix:main.composite) speeds up page loading by 3–5 times compared to regular. Goal — product card TTFB < 200 ms. For sessions we use Redis (SESSION_SAVE_HANDLER = redis in .settings.php). Lazy load images, CDN for static, SQL optimization (especially JOINs on b_iblock_element_property). As noted in the official Bitrix documentation, composite cache delivers a page from HTML, bypassing PHP execution and database requests, giving a speed advantage of up to 5x.

Why is caching critical for an online store?

Each second of page load delay reduces conversion by an average of 7%. At TTFB > 400 ms, 32% of users leave the site. Composite cache delivers a page from HTML, bypassing PHP execution and database requests — this gives a speed advantage of up to 5 times. For product cards with frequent price and stock changes, we use tagged caching: invalidation occurs only for affected entities. In practice, we have reduced TTFB from 1.2 seconds to 180 ms. Time savings on catalog loading — up to 60%.

Store types and their features

Store type Key modules Features
B2C retail catalog.smart.filter, catalog.compare.list, reviews, ratings Faceted index, conversion funnel from card to payment
B2B wholesale dealer prices (b_catalog_group), min. lots, credit limits Personal accounts, quick order by SKU, PDF invoices
Digital goods licenses, subscriptions, files OnSaleOrderPaid -> automatic access granting
Marketplace "Marketplace" module or custom Multiple sellers, separate accounting, commission model
PWA / mobile Progressive Web App, React Native + REST API Offline catalog, push notifications

Integrations: payment systems, delivery, CRM, marketplaces

Payment systems. Handlers in sale.handlers: YooKassa, CloudPayments, Tinkoff, Sberbank, Apple Pay, Google Pay, installment. Callback sale.payment.notify for status confirmation. Delivery. Handlers sale.delivery for CDEK, Boxberry, Russian Post, DPD — real-time cost calculation via API, tracking. Warehouse management. Reservation (RESERVED = Y in b_sale_basket), automatic write-off upon shipment, notifications when stock falls below threshold, pre-order for goods in transit. CRM. Bitrix24 or amoCRM — orders from b_sale_order are sent automatically, client base is synchronized. Triggers: abandoned cart, review request, reactivation. Marketplaces. Export via YML to Ozon, Wildberries, Yandex.Market. Orders flow into a single system. Analytics and marketing. GA4, Yandex.Metrica, email newsletters (Unisender, SendPulse). Logistics. MyWarehouse, Antor — labels, picking lists.

Migration from other CMS

Migration from OpenCart, WooCommerce, Shopify, MODX: transfer of catalog (elements, properties, sections, images, SEO-URLs), migration of client base (b_user) and order history (b_sale_order), 301 redirects via urlrewrite.php. Parallel operation during the transition period — old site sells, new one is accepted. Team experience — 50+ migration projects.

Example migration: from OpenCart with 50,000 products We transferred all data, including custom attributes and review history, in two weeks with zero downtime. The new store was tested in parallel before switching DNS. Result: 25% faster page load and 15% increase in sales.

What is included in the work (deliverables)

Deliverable Description
Technical specification Business requirements, catalog structure, integrations, cart logic
Infoblock architecture Price types, properties, sections, HL-blocks, ORM entities
Components and templates Custom or adapted standard (Component 2.0)
Integrations Payments, delivery, CRM, marketplaces, 1C
Documentation Content filling instructions, REST API, DB schema
Team training Working with admin panel, exports, updates
Warranty Free support 3 months after launch, bug fixes

Stages and timelines

Average project duration — 2 to 4 months:

  1. Analytics (1–2 weeks) — business requirements, catalog structure, integrations, technical specification
  2. Design (2–3 weeks) — prototypes, design system, layouts
  3. Development (4–8 weeks) — components, templates, integrations, content
  4. Testing (1–2 weeks) — functional, load, acceptance
  5. Launch (2–3 days) — deployment, monitoring, operational support

Budget range: from $10,000 for a basic store to $60,000+ for a complex marketplace with multiple integrations. Clients typically see a 20–30% increase in conversion after optimization. Contact us for a precise estimate — we tailor the solution to your specific catalog size and business logic.

Loyalty program and conversion

Bonus system: points for purchases, reviews, recommendations. Accrual rules by categories, points payment limit, expiration period — all in personal account. VIP levels (bronze, silver, gold, platinum) with increased cashback and free shipping. Recommendations 'You may also like', 'Complete your purchase' — built-in Bitrix tools + RetailRocket or Mindbox. Triggers: birthday discount, promo code for return, interest chain. Personalization via catalog.recommended.products and catalog.viewed.products. A/B testing of two card variants on real traffic. Enhanced E-commerce in GA4 and Yandex.Metrica — full path from click to return visit.

Request a free technical audit of your current store. Our engineers will identify performance bottlenecks and migration risks. Order turnkey online store development — get a ready solution with warranty and support.