Configuring Google Business Profile for 1C-Bitrix
Google Business Profile (formerly Google My Business) determines what a user sees in the Knowledge Panel to the right of search results for the company name. Mismatch between site and Google profile data is one of the few SEO errors that can be fixed in a day and show results within a week.
Schema.org Markup as Foundation
Google reads organization data from the site via structured markup. This is the primary source for Knowledge Panel formation. Without correct LocalBusiness (or more specific type: Store, Restaurant, MedicalOrganization), Google uses unstructured text from the "Contacts" page — with unpredictable results.
In Bitrix, organization data is stored either in an infoblock or in custom site settings. For centralized storage — infoblock "Company Info" with symbol code company_info. Structured markup is generated in the template's footer.php:
<?php
$arCompany = \CIBlockElement::GetList(
[],
['IBLOCK_CODE' => 'company_info', 'ACTIVE' => 'Y'],
false,
['nTopCount' => 1],
['ID', 'PROPERTY_*']
)->GetNextElement()?->GetProperties();
?>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Store",
"name": "<?= COption::GetOptionString('main', 'site_name') ?>",
"telephone": "<?= htmlspecialcharsEx($arCompany['PHONE']['VALUE']) ?>",
"email": "<?= htmlspecialcharsEx($arCompany['EMAIL']['VALUE']) ?>",
"address": {
"@type": "PostalAddress",
"streetAddress": "<?= htmlspecialcharsEx($arCompany['ADDRESS']['VALUE']) ?>",
"addressLocality": "<?= htmlspecialcharsEx($arCompany['CITY']['VALUE']) ?>",
"postalCode": "<?= htmlspecialcharsEx($arCompany['ZIP']['VALUE']) ?>",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": <?= (float)$arCompany['LAT']['VALUE'] ?>,
"longitude": <?= (float)$arCompany['LON']['VALUE'] ?>
},
"sameAs": [
"<?= htmlspecialcharsEx($arCompany['VK_URL']['VALUE']) ?>",
"<?= htmlspecialcharsEx($arCompany['TG_URL']['VALUE']) ?>"
]
}
</script>
Google Business Profile API
For automatic synchronization of site data with GBP, use Google Business Profile API. Service account with OAuth 2.0 is required.
Basic request to update via cURL from Bitrix:
// Update phone number in GBP when changed in infoblock
AddEventHandler('iblock', 'OnAfterIBlockElementUpdate', function($id) {
if (!isCompanyInfoElement($id)) return;
$token = getGBPAccessToken(); // from saved refresh_token
$locationName = 'accounts/{ACCOUNT_ID}/locations/{LOCATION_ID}';
$data = ['phoneNumbers' => ['primaryPhone' => getNewPhone($id)]];
$ch = curl_init("https://mybusinessbusinessinformation.googleapis.com/v1/{$locationName}?updateMask=phoneNumbers");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'PATCH',
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
],
CURLOPT_RETURNTRANSFER => true,
]);
curl_exec($ch);
curl_close($ch);
});
Google Reviews in Bitrix
GBP API allows reading reviews and displaying them on the site. This builds trust and adds User-Generated Content without moderation. Caching is mandatory — Google limits API requests:
$cache = \Bitrix\Main\Data\Cache::createInstance();
$cacheKey = 'gbp_reviews';
if ($cache->startDataCache(3600 * 6, $cacheKey, '/gbp')) {
$reviews = fetchReviewsFromGBP($locationName, $token);
$cache->endDataCache(['reviews' => $reviews]);
} else {
$reviews = $cache->getVars()['reviews'];
}
Review Markup: AggregateRating
If reviews from GBP are displayed on the site, they can be included in the AggregateRating markup in the Schema.org block. Google uses this data for stars in the search snippet. Important: you cannot use your own reviews for AggregateRating — only independent sources. Google reviews qualify.







