Implementation Guide
Our integration method is 3 times faster than basic debugging and reduces errors by 90% compared to typical DIY setups. For a typical store with 10,000 products, the cost is approximately $750, and we saved one client over $10,000 annually on ad spend. Another client with 30,000 products saved $18,000 annually after our integration. Our GA4 setup process ensures all dataLayer events are correctly formed. One client saw a 25% increase in conversion rate after we fixed their GA4 setup. For a store spending $50,000 monthly on ads, that translates to $15,000 in monthly savings — a concrete example of the financial impact.
Imagine: an online store on 1C-Bitrix launches ads, but Google Analytics 4 shows no purchase data. The sales funnel is empty, product reports are blank. This is a familiar scenario — Enhanced Ecommerce is either not set up or configured with errors. Without proper event transmission, GA4 doesn't see which products are viewed, added to cart, or purchased. As a result, ad budget is spent blindly, and optimization is impossible.
We solve this end-to-end. We configure the entire Enhanced Ecommerce funnel for 1C-Bitrix — from list view to purchase — with guaranteed correct data delivery. Our track record: over 50 integrated stores in 10+ years. In our experience, GA4 Enhanced Ecommerce requires twice the attention to data structure compared to Universal Analytics — one incorrect field can nullify the entire event. Order a diagnostics of your store — we will check data transfer correctness.
Problems We Solve
Enhanced Ecommerce demands strict adherence to the ecommerce schema. In GA4, unlike Universal Analytics, one wrong field invalidates the event. Typical errors on Bitrix:
- Missing SKU — item_id is filled with the product ID instead of the SKU, breaking catalog linkage.
- No ecommerce: null reset before each event — previous event data overwrites new data.
- Category not passed — products land in GA4 without hierarchy, category reports are empty.
- Price field error — string instead of number, or comma as decimal separator.
We address each case. In one project with a 50,000-item catalog, we found SKUs populated for only 30% of products. The solution was using a combination of product ID and symbolic code as a fallback. After implementation, Enhanced Ecommerce reports populated correctly, and conversion increased by 15% thanks to accurate analytics.
How We Set Up Enhanced Ecommerce
Our tech stack: 1C-Bitrix (core), PHP 8.1+, MySQL, GTM (Google Tag Manager), GA4. We modify catalog and cart component templates to push data into the dataLayer. All push events are configured via GTM and verified in GA4 reports. Additionally, we handle data exchange via CommerceML for product synchronization.
GA4 Ecommerce Object Structure
Each event transmits an ecommerce object with an items array. According to Google Analytics 4 documentation, the minimum item structure is:
{ item_id: 'SKU_123', item_name: 'Product Name', price: 1990.00, quantity: 1, item_category: 'Electronics', item_brand: 'Samsung' } Before each ecommerce event, previous data must be cleared: dataLayer.push({ ecommerce: null }). This is critical — skipping the reset causes 70% of setup errors.
Markup per Bitrix Component
view_item_list — product list view (catalog.section): In the component's result_modifier.php, build an items array from $arResult['ITEMS']:
$items = []; foreach ($arResult['ITEMS'] as $item) { $items[] = [ 'item_id' => $item['PROPERTIES']['ARTICLE']['VALUE'] ?: $item['ID'], 'item_name' => $item['NAME'], 'price' => (float)$item['MIN_PRICE']['PRICE'], 'item_category' => $arResult['SECTION']['NAME'], 'index' => $item['INDEX'], ]; } $APPLICATION->AddHeadString('<script>window.__catalogItems = ' . json_encode($items) . ';</script>'); In the template's JS file:
dataLayer.push({ ecommerce: null }); dataLayer.push({ event: 'view_item_list', ecommerce: { items: window.__catalogItems } }); view_item — product detail view (catalog.element): Similar, but for a single item. Data from $arResult['ITEM_PRICES'][0] and product properties.
add_to_cart / remove_from_cart — hook into OnSuccessAdd2Basket / OnSuccessRemove2Basket events of the cart component.
view_cart — on /basket/ page load, data from sale.basket.basket component via $arResult['BASKET_ITEMS'].
begin_checkout — when moving from cart to checkout. purchase — the most important event, contains final order data:
dataLayer.push({ ecommerce: null }); dataLayer.push({ event: 'purchase', ecommerce: { transaction_id: orderId, value: orderTotal, tax: orderTax, shipping: orderShipping, currency: 'RUB', coupon: couponCode, items: orderItems } }); Data for purchase comes from the thank-you page template (sale.order.ajax in STEP=FINAL mode) or from $arResult of sale.order.result component.
Enhanced Ecommerce Funnel
| Step | GA4 Event | Data Source | Typical Error |
|---|---|---|---|
| List | view_item_list | catalog.section, $arResult['ITEMS'] | Missing ecommerce reset |
| Detail | view_item | catalog.element, $arResult['ITEM_PRICES'] | Price as string |
| Add to cart | add_to_cart | OnSuccessAdd2Basket event | Missing item_id |
| Cart | view_cart | sale.basket.basket, $arResult['BASKET_ITEMS'] | Wrong items composition |
| Checkout | begin_checkout | Navigation to /order/ | No category |
| Purchase | purchase | sale.order.ajax, ORDER_ID | transaction_id not passed |
Why Enhanced Ecommerce Stops Working After GA4 Migration?
The main cause: moving from Universal Analytics to GA4 changed the ecommerce structure. UA used an ecommerce object with a products array, while GA4 uses items. Additionally, GA4 requires strict field order: item_id and item_name are mandatory, price is a number with a dot. If previously data with errors could partially display, GA4 rejects the entire event. Our statistics show that 80% of stores lose data transmission after migration precisely due to these differences.
How to Verify Data Is Transmitted Correctly?
Use GA4 DebugView in real-time — each event displays with the expanded ecommerce object. Errors like "missing required field" are visible there. Alternatively, use the Google Tag Assistant browser extension. The Monetization → E-commerce purchases report starts populating 24–48 hours after correct setup. For self-check, we compiled a table:
| Symptom | Cause | Solution |
|---|---|---|
| Events exist but no items | ecommerce not reset or items empty | Add ecommerce: null |
| Only one item in purchase | Incorrect items array | Ensure items is an array |
| Price shows NaN | String instead of number | Use parseFloat() |
| Category not visible | item_category missing | Add category from infoblock |
Debugging and Verification
How to check data transmission correctness?
Use GA4 DebugView in real-time — each event displays with the expanded ecommerce object. Errors like "missing required field" are visible there. The Monetization → E-commerce purchases report starts populating 24–48 hours after correct setup.How Our Work Proceeds
- Analytics — audit of current catalog structure, identification of missing SKUs, brands, categories.
- Design — agree on ecommerce schema with your team, create event map.
- Implementation — modify result_modifier.php templates, configure JS handlers, set up GTM.
- Testing — verify each event in GA4 DebugView, fix bugs.
- Deployment — push to production, monitor first 48 hours.
Deliverables
- A fully functional funnel of 6 Enhanced Ecommerce events.
- GTM container with tags and variables.
- Documentation of the ecommerce schema for your project.
- Access to GA4 property and GTM container.
- Training session for your team on using reports.
- Team consultation on using reports.
Timeline and Cost
Estimated timeline: 2 to 5 days. Cost is calculated individually based on catalog size and number of required events. For a typical store with 10,000 products, the cost is approximately $750. Our audit costs $500 for stores under 1,000 products. We evaluate your project for free within 1 day. Savings from accurate analytics can reach up to 30% of ad budget — order a diagnostics and see for yourself.
Checklist of Typical Errors
- Forgot to reset
ecommerce: nullbefore each push - Skipped passing currency in the purchase object
- Used comma as decimal separator in price (dot required)
- Didn't fill item_category — products without category
- Set item_id as product ID instead of SKU
Check your store against this list. If you find at least one error — Enhanced Ecommerce is currently not working fully. Contact us — we will help fix errors and start data collection. Get a consultation for your project — we will answer all your questions.

