Setting Up Video Reviews in 1C-Bitrix Product Card

We often encounter a scenario where a product card loads a YouTube iframe, and users only see an empty block until the player initializes. This increases LCP on mobile devices up to 4 seconds, and conversion drops. We solved this with lazy loading of previews. Lazy-loaded previews are 10 times more

Our competencies:

Frequently Asked Questions

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1460
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Website development for FIXPER company
    1019
  • 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
    763
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Development based on 1C Enterprise for MIRSANBEL
    882
  • image_crm_dolbimby_434_0.webp
    Website development on CRM Bitrix24 for DOLBIMBY
    809
  • image_crm_technotorgcomplex_453_0.webp
    Development based on Bitrix24 for the company TECHNOTORGKOMPLEKS
    1164

We often encounter a scenario where a product card loads a YouTube iframe, and users only see an empty block until the player initializes. This increases LCP on mobile devices up to 4 seconds, and conversion drops. We solved this with lazy loading of previews. Lazy-loaded previews are 10 times more efficient than direct iframes: page weight drops from 800 KB to 10 KB, and the number of HTTP requests decreases by 4 times. Our experience — over 7 years with Bitrix, over 120 projects with video integrations. According to a Google Web Vitals study, each second of load delay reduces conversion by 20%. Based on our estimates, lazy-load previews reduce hosting costs by up to 30% due to reduced traffic.

Where to store video in the infoblock?

Bitrix does not have a native 'video' field type in standard property types. Most often, a video review is stored in one of three places:

  • Property of type S (string) with URL to YouTube/Vimeo — the most common option
  • Property of type F (file) — direct mp4 upload to the server, table b_iblock_element_property
  • Detailed description field (HTML/TinyMCE) — video buried in b_iblock_element.DETAIL_TEXT

For an online store on bitrix.catalog, the right way is a separate property with a symbolic code, e.g., VIDEO_URL, tied to the catalog infoblock. Query it via CIBlockElement::GetProperty() or via \Bitrix\Iblock\ElementPropertyTable (D7):

$props = \Bitrix\Iblock\ElementPropertyTable::getList([ 'filter' => ['IBLOCK_ELEMENT_ID' => $elementId, 'CODE' => 'VIDEO_URL'], 'select' => ['VALUE'], ])->fetch(); 

Compare storage methods:

Method Availability Convenience Caching
URL property high simple easy
File property medium complex medium
DETAIL_TEXT low confusing poor

Why does iframe slow down loading?

The main problem — <iframe src="https://www.youtube.com/embed/..." title="YouTube video"> blocks the main thread: the browser loads the entire YouTube JS bundle (500–800 KB) even before the user clicks Play. This is critical for mobile LCP and bounce rate.

Solution: render a custom preview via YouTube's thumbnail API (https://img.youtube.com/vi/{VIDEO_ID}/hqdefault.jpg) and replace it with an iframe only on click.

In the catalog.element component template (template.php), the logic is:

<?php if (!empty($arResult['PROPERTIES']['VIDEO_URL']['VALUE'])): ?> <?php $videoUrl = $arResult['PROPERTIES']['VIDEO_URL']['VALUE']; preg_match('/(?:v=|youtu\.be\/)([a-zA-Z0-9_-]{11})/', $videoUrl, $matches); $videoId = $matches[1] ?? ''; ?> <div class="product-video" data-video-id="<?= htmlspecialchars($videoId) ?>"> <img src="https://img.youtube.com/vi/<?= $videoId ?>/hqdefault.jpg" loading="lazy" alt="Video review of product" class="video-preview"> <button class="video-play-btn" aria-label="Play video">▶</button> </div> <?php endif; ?> 

JavaScript on click replaces the div with an iframe with autoplay=1. This removes an extra HTTP request to YouTube on page load and reduces page weight by 500–800 KB.

Comparison: iframe vs lazy-load

Parameter iframe lazy-load preview
Page weight +500–800 KB +5–10 KB
Impact on LCP worsens by 2–4 s no impact
Number of requests 3–5 1 (preview)
Time to interaction 2–3 s 0.1 s

How to set up video caching?

The catalog.element template is cached via CBitrixComponent::StartResultCache(). If the video changes in the admin panel, the cache is not reset automatically — you need either to call $this->AbortResultCache() when VIDEO_URL is empty, or add a cache tag:

$GLOBALS['CACHE_MANAGER']->RegisterTag('iblock_id_' . $iblockId); 

Then, when an infoblock element is saved (event OnAfterIBlockElementUpdate), the cache is correctly invalidated.

Video in product variations (SKUs)

If SKU variations (table b_catalog_product, type P — offer) have different videos, you need to load the property of the specific offer, not the parent element. The standard catalog.element does not do this — it only returns properties of the main product. Solution: an AJAX request on SKU change to a custom action or component that returns VIDEO_URL for the selected offerId.

In the bitrix:catalog.element component, the parameter OFFER_IBLOCK_ID points to the offers infoblock — from there you need to pull media properties.

How to add structured data for video?

Google indexes video in the product card if there is VideoObject markup. Bitrix does not generate it automatically. Add it manually in the template:

<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "VideoObject", "name": "<?= htmlspecialcharsEx($arResult['NAME']) ?>", "thumbnailUrl": "https://img.youtube.com/vi/<?= $videoId ?>/hqdefault.jpg", "uploadDate": "<?= date('Y-m-d') ?>", "embedUrl": "https://www.youtube.com/embed/<?= $videoId ?>" } </script> 

This gives a chance to appear in the video carousel in search without third-party plugins.

Common mistakes when setting up video
  • Using an HTML property: video gets lost in cache and is difficult to extract.
  • Missing cache tags: after changing the video, users see the old player.
  • Ignoring mobile speed: iframe without lazy-load kills LCP.
  • Missing VideoObject schema: video is not indexed as video.

What is included in setting up video reviews?

  • Creating or configuring a VIDEO_URL property for the catalog infoblock
  • Developing a lazy-load preview with YouTube thumbnails
  • Setting up tagged caching for the component
  • Implementing structured data VideoObject
  • Testing on mobile and desktop devices
  • Documentation on managing video from the admin panel

Work process

  1. Analysis — audit the current product card, measure LCP and number of requests.
  2. Design — choose the storage method and caching scheme.
  3. Development — modify the catalog.element template, JS logic, and JSON-LD.
  4. Testing — check on 3–5 popular devices.
  5. Deployment — push to production with metric monitoring.

Timeline: from 1 to 3 business days depending on integration complexity. The cost is determined after analysis. To get started, request a free consultation and detailed audit.

Our experience — over 7 years with Bitrix, certified specialists, and a guarantee on all modifications. Contact us for a project evaluation — we will analyze your current product card for free and propose an optimal solution.