Sales Personalization: Retail Rocket for 1C-Bitrix
We configure comprehensive integration between 1C-Bitrix and the Retail Rocket personalization platform for online stores that prioritize customer experience. Retail Rocket is a leading e-commerce personalization platform: product recommendations, personalized email campaigns, behavioral analytics boosting conversion by 20–40%. The technical integration consists of two parts: transmitting user behavior data via a JavaScript tracker and synchronizing the product catalog through an XML feed with stock and price updates.
Our team has over 7 years of Bitrix experience and has implemented more than 15 integrations with Retail Rocket for stores of various profiles—from niche boutiques to large marketplaces with millions of SKUs. We guarantee stable operation under high load, minimal data synchronization delay (less than 15 minutes), and correct functioning of recommendation blocks on all site pages. The result is an increase in average order value and repeat purchases.
How is the XML Product Feed Generated?
Retail Rocket accepts a product feed in Yandex.Market YML format or its own XML format. The easiest approach is to use the existing YML feed from Bitrix—if you already have one, it will work. A customized feed with additional fields (SKU, brand, color) enables finer segmentation. Here is a minimal PHP example:
// Minimal structure for Retail Rocket
function generateRetailRocketFeed(): string
{
$xml = '<?xml version="1.0" encoding="UTF-8"?><yml_catalog>';
$xml .= '<shop><name>' . htmlspecialchars(SITE_NAME) . '</name>';
$xml .= '<url>https://' . SITE_SERVER_NAME . '</url>';
$xml .= '<currencies><currency id="RUB" rate="1"/></currencies>';
$xml .= '<categories>';
$sections = CIBlockSection::GetList(
['LEFT_MARGIN' => 'ASC'],
['IBLOCK_ID' => CATALOG_IBLOCK_ID, 'ACTIVE' => 'Y'],
false,
['ID', 'NAME', 'IBLOCK_SECTION_ID']
);
while ($section = $sections->GetNext()) {
$parentAttr = $section['IBLOCK_SECTION_ID']
? ' parentId="' . $section['IBLOCK_SECTION_ID'] . '"'
: '';
$xml .= '<category id="' . $section['ID'] . '"' . $parentAttr . '>'
. htmlspecialchars($section['NAME']) . '</category>';
}
$xml .= '</categories>';
$xml .= '<offers>';
$res = CIBlockElement::GetList(
[],
['IBLOCK_ID' => CATALOG_IBLOCK_ID, 'ACTIVE' => 'Y'],
false,
false,
['ID', 'NAME', 'DETAIL_PAGE_URL', 'PREVIEW_PICTURE', 'DETAIL_PICTURE',
'PREVIEW_TEXT', 'IBLOCK_SECTION_ID']
);
while ($el = $res->GetNextElement()) {
$fields = $el->GetFields();
$props = $el->GetProperties();
$price = CCatalogProduct::GetOptimalPrice($fields['ID']);
$priceVal = $price['PRICE']['PRICE'] ?? 0;
$imgId = $fields['DETAIL_PICTURE'] ?: $fields['PREVIEW_PICTURE'];
$imgUrl = '';
if ($imgId) {
$imgUrl = 'https://' . SITE_SERVER_NAME . CFile::GetPath($imgId);
}
$url = 'https://' . SITE_SERVER_NAME . $fields['DETAIL_PAGE_URL'];
$xml .= '<offer id="' . $fields['ID'] . '" available="true">';
$xml .= '<url>' . htmlspecialchars($url) . '</url>';
$xml .= '<price>' . number_format($priceVal, 2, '.', '') . '</price>';
$xml .= '<currencyId>RUB</currencyId>';
$xml .= '<categoryId>' . $fields['IBLOCK_SECTION_ID'] . '</categoryId>';
if ($imgUrl) {
$xml .= '<picture>' . htmlspecialchars($imgUrl) . '</picture>';
}
$xml .= '<name>' . htmlspecialchars($fields['NAME']) . '</name>';
if ($fields['PREVIEW_TEXT']) {
$xml .= '<description><![CDATA['
. strip_tags($fields['PREVIEW_TEXT']) . ']]></description>';
}
$sku = $props['CML2_ARTICLE']['VALUE'] ?? $fields['ID'];
$xml .= '<param name="sku">' . htmlspecialchars($sku) . '</param>';
$xml .= '</offer>';
}
$xml .= '</offers></shop></yml_catalog>';
return $xml;
}
The feed is cached for 2–4 hours and updated on product change invalidation. The feed URL is provided in the Retail Rocket dashboard.
How is the JavaScript Tracker Installed?
Retail Rocket provides a JS library (rrpushdown) that is included on all pages. In the Bitrix template—in footer.php or via addExternalJs:
// Base Retail Rocket code (inserted once)
var retailrocket = window.retailrocket || [];
(function(d, w) {
var rr = d.createElement('script');
rr.type = 'text/javascript';
rr.src = '//cdn.retailrocket.net/content/javascript/tracking.js';
d.head.appendChild(rr);
})(document, window);
Product card view event. In the catalog.element template:
// template.php
$productId = $arResult['ID'];
?>
<script>
retailrocket.push(['setAccountId', '<?= RETAIL_ROCKET_ACCOUNT_ID ?>']);
retailrocket.push(['track', 'view', { productId: '<?= $productId ?>' }]);
</script>
Add‑to‑cart event. In the AJAX add handler:
// On successful add to basket
retailrocket.push(['track', 'addToBasket', {
productId: String(productId),
quantity: qty
}]);
Checkout event. On the order confirmation page or via a handler for OnSaleOrderSaved:
// In the order confirmation page template
$orderId = $arOrder['ID'];
$orderPrice = $arOrder['PRICE'];
$items = [];
foreach ($arOrder['BASKET'] as $item) {
$items[] = [
'id' => $item['PRODUCT_ID'],
'qnt' => $item['QUANTITY'],
'price' => $item['PRICE'],
];
}
?>
<script>
retailrocket.push(['track', 'transaction', {
transaction: '<?= $orderId ?>',
revenue: <?= $orderPrice ?>,
lineItems: <?= json_encode($items) ?>
}]);
</script>
Search event:
retailrocket.push(['track', 'search', { searchPhrase: searchQuery }]);
What Benefits Does Retail Rocket Provide?
Stores using Retail Rocket see conversion rates 2-3x higher than those with basic recommendations. In a typical e‑commerce site, personalization lifts conversions by 15–25%, and the average order value rises 10–15%. With these metrics, a store with $500K annual turnover can generate over $50K in additional revenue each year.
Recommendation Blocks
After configuration in the Retail Rocket dashboard, insert the blocks into templates:
<!-- On the homepage: "Recommended" -->
<div data-retailrocket-markup-block="5f4a3b2c1d0e9f8e7d6c5b4a"
data-algorithm="popular">
</div>
<!-- In product card: "Frequently bought together" -->
<div data-retailrocket-markup-block="5f4a3b2c1d0e9f8e7d6c5b4b"
data-algorithm="related"
data-item-id="<?= $arResult['ID'] ?>">
</div>
<!-- In cart: "You might also like" -->
<div data-retailrocket-markup-block="5f4a3b2c1d0e9f8e7d6c5b4c"
data-algorithm="basket">
</div>
Widgets render on the Retail Rocket side—they load product IDs and request display data from your catalog via JS.
User Authorization and Email Binding
To link behavior to a user profile, we pass the email on login:
// In the successful authorization handler
if ($USER->IsAuthorized()) {
$email = $USER->GetEmail();
?>
<script>
retailrocket.push(['setEmail', '<?= htmlspecialchars($email) ?>',
function() { console.log('RR email set'); }
]);
</script>
<?php } ?>
Implementation Timeline
| Scope | Components | Duration |
|---|---|---|
| Basic integration (feed + tracker) | Feed + 3 events + script inclusion | 1–2 days |
| Full integration (all events + recommendation blocks) | + widgets + email event + A/B test | 3–5 days |
| Personalized email campaigns | + trigger scenarios via Retail Rocket Email | add 2–3 days |
What's Included in the Integration
- Documentation: detailed technical guide and API reference for your team.
- Access: credentials to Retail Rocket dashboard and feed URLs.
- Training: up to 2 hours of online training for your developers and marketers.
- Support: 12‑month post‑launch support with free bug fixes and minor updates.
- Deliverables: complete source code for feed generation, tracker integration, and recommendation widgets.
Our Process
- Data collection: gather existing feed configurations, site structure, and business goals.
- Audit & analysis: review current Bitrix setup, identify integration points and potential conflicts.
- Design: define feed schema, event mapping, and widget placement.
- Estimation: provide a precise scope and timeline after analysis—costs determined per project.
- Development: implement feed generation, tracker installation, and widget integration.
- Testing: validate on a staging environment with real product data and traffic simulations.
- Launch: deploy to production and monitor initial performance.
We provide full documentation and training for your team, ensuring you can maintain the system independently. Every project includes a 12-month support period—any issues found within that year are fixed free of charge.
Typical Integration Challenges
- Incomplete product data: missing SKU, price, or category fields in the feed lead to incorrect recommendations. We enforce data completeness with validation rules.
- JavaScript conflicts: custom scripts interfering with the Retail Rocket tracker. We isolate the tracker code and test across all page types.
- Cache issues: outdated feed or cached pages showing stale recommendations. We configure proper cache invalidation on product updates.
Retail Rocket documentation recommends including all product attributes for optimal recommendation accuracy.
Want to personalize your store with Retail Rocket? Leave a request for a free consultation—we will analyze your system and offer the best solution. Pricing is determined after a detailed assessment of your requirements.







