Automate Order Push Notifications via Telegram in 1C-Bitrix
When an order status changes in 1C-Bitrix, standard email notifications often end up in spam—open rates rarely exceed 20%. Telegram delivers messages instantly with a 90% read rate. Implementing a Telegram bot reduces support inquiries by 30–40% and significantly cuts SMS costs, as confirmed by a RetailCRM study. Additionally, operational costs drop: push notifications cut manual operator responses by 50%, saving substantial funds on an average order flow. We assess your project in one day—contact us to discuss the details.
Telegram is 4× faster than email in delivery and 2× cheaper than SMS. In 9 out of 10 cases, users read a Telegram push notification within the first minutes. This reduces support load and speeds up customer communication. For online stores on 1C-Bitrix, the integration is implemented through the OnSaleOrderStatusChange event handler and does not require replacing the existing notification system.
Problems Solved by a Telegram Bot
-
Email in spam: up to 30% of emails never reach the customer. Telegram guarantees 99% delivery.
-
Notification delays: emails can take up to 5 minutes. Telegram—1–2 seconds.
-
Low readability: 80% of emails go unread. Telegram messages are opened within minutes.
-
Manual support: operators spend time answering status queries. The bot takes over.
Why Telegram Notifications Are More Effective than Email?
Comparison by key metrics:
| Parameter |
Email |
Telegram |
| Delivery |
Up to 5 minutes, often spam |
Instant, 99% delivery |
| Readability |
20% open rate |
90% read rate |
| Setup |
Built into Bitrix |
Requires bot + handler |
| Cost |
Included in hosting |
Free via Bot API |
How the Integration with Bitrix Works
When an order status changes, Bitrix fires the OnSaleOrderStatusChange event. The standard notification mechanism (/bitrix/admin/posting_list.php) sends email. Telegram is connected as an additional channel via an event handler. For more details on events, see the official Bitrix documentation.
Which Order Statuses Are Supported?
| Status |
Code |
Notification Text |
| New order |
N |
Order #%d received and awaiting processing. |
| Sent for delivery |
P |
Order #%d sent for delivery. |
| Completed |
F |
Order #%d completed. Thank you for your purchase! |
| Canceled |
X |
Order #%d canceled. |
Creating an Order Status Change Handler
Creating a Telegram Bot for Notifications
The bot for order notifications is push-only: it only sends, not receives commands. Created via @BotFather:
/newbot
Name: MyShop Notifications
Username: myshop_orders_bot
Get a token like 1234567890:AAHb-xxxxxx. Store the token in the module settings or in /bitrix/.settings.php, not in template code.
The user must start a dialog with the bot (/start) so the bot gets their chat_id. To do this, add a button in the personal account that opens the link https://t.me/myshop_orders_bot?start=uid_12345.
Saving the User's chat_id
// Webhook bot receives /start with parameter
$update = json_decode(file_get_contents('php://input'), true);
$text = $update['message']['text'] ?? '';
$chatId = $update['message']['chat']['id'];
if (preg_match('/^\/start uid_(\d+)$/', $text, $matches)) {
$userId = (int)$matches[1];
// Save chat_id to user field UF_TELEGRAM_CHAT_ID
\Bitrix\Main\UserTable::update($userId, [
'UF_TELEGRAM_CHAT_ID' => $chatId,
]);
// Confirm to the user
TelegramApi::sendMessage($chatId, 'Telegram order notifications have been connected.');
}
Order Status Change Handler
// /local/php_interface/init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'sale',
'OnSaleOrderStatusChange',
function (\Bitrix\Main\Event $event) {
$order = $event->getParameter('ENTITY');
$statusId = $order->getField('STATUS_ID');
$userId = $order->getUserId();
// Read user's chat_id
$user = \Bitrix\Main\UserTable::getById($userId)->fetch();
$chatId = $user['UF_TELEGRAM_CHAT_ID'] ?? null;
if (!$chatId) {
return; // User hasn't connected Telegram
}
// Build message based on status
$messages = [
'N' => 'Order #%d received and awaiting processing.',
'P' => 'Order #%d sent for delivery.',
'F' => 'Order #%d completed. Thank you for your purchase!',
'X' => 'Order #%d canceled.',
];
$template = $messages[$statusId] ?? null;
if (!$template) {
return;
}
$text = sprintf($template, $order->getId());
$text .= "\n\nDetails: " . SITE_SERVER_NAME . '/personal/orders/' . $order->getId() . '/';
// Send via Telegram Bot API
TelegramBotService::send($chatId, $text);
}
);
Telegram Bot API Send Class
class TelegramBotService
{
private static string $token = '1234567890:AAHb-xxxxxx';
public static function send(string $chatId, string $text, array $options = []): bool
{
$params = array_merge([
'chat_id' => $chatId,
'text' => $text,
'parse_mode' => 'HTML',
], $options);
$ch = curl_init('https://api.telegram.org/bot' . self::$token . '/sendMessage');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($params),
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 5,
]);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true)['ok'] ?? false;
}
}
Store the token not in code but in config:
// /bitrix/.settings.php
'custom' => [
'value' => [
'telegram_bot_token' => '1234567890:AAHb-xxxxxx',
],
],
Error Handling for Sending
Add to the TelegramBotService class a check of the response and error logging. If curl returns an error or API returns `ok: false`, write the log to a file or to the Bitrix system log. This helps quickly diagnose problems.
What's Included in the Work
- Creation and configuration of the Telegram bot via @BotFather
- Development of the connection page in the buyer's personal account
- Implementation of the event handler on
OnSaleOrderStatusChange
- Saving
chat_id to the user field UF_TELEGRAM_CHAT_ID
- Testing all order statuses (N, P, F, X and custom ones)
- Documentation for operation and further support
- Admin training on working with the bot
Timelines for Setup
Creating the bot, user field, connection page, event handler—6–10 hours. In complex cases (many statuses, non-standard logic) the timeline extends to 2–3 days. We guarantee stable notification operation after setup. Our team holds 1C-Bitrix certification and has over 10 years of development experience on this platform. During our work, we have implemented 50+ projects with Telegram notification integration. Get a consultation on setting up a Telegram bot for your store.
Typical Setup Mistakes
- Storing the token in a template file—the token should be in
/bitrix/.settings.php or in module settings.
- Missing check for
chat_id existence—if the user hasn't connected the bot, the code should exit gracefully without errors.
- Not all order statuses handled—for each status a message template must be provided, otherwise no notification will be sent.
- Ignoring order cancellation notifications—this status is often missed, but the customer needs to know about a cancellation.
How to Diagnose Delivery Problems?
If notifications don't arrive, check whether the user started a dialog with the bot (command /start). Ensure the token is active and chat_id is saved in UF_TELEGRAM_CHAT_ID. Review the handler log—possibly rate limiting by Telegram (30 msg/sec). In complex cases, enable step-by-step logging.
Order Telegram bot setup—get a consultation and project estimate within one day without prepayment. We integrate the bot with your CRM and 1C, ensuring stable notifications at all order stages.
How does 1C-Bitrix cart customization solve conversion loss?
We have been optimizing 1C-Bitrix cart setup and checkout for over a decade. In that time, a common pain emerged: the standard sale.order.ajax loses 10–15% of buyers at each step. Three steps, and a third of those who already added a product leave. Not because they changed their minds — the interface stumbles.
sale.order.ajax throws a 500 error if even one delivery handler is misconfigured. It hangs for 15 seconds when calculating CDEK — the request is synchronous, no timeout. It requires a TIN from individuals because the property is not separated by payer type. Each such case is direct losses that the system does not compensate.
Our experience (300+ projects, certified specialists) shows that reworking the checkout with a single focus — conversion — pays off in 1–2 months. Minimum steps, maximum convenience, reliable integration with payments and delivery.
Why does one-step checkout increase conversion?
All fields on one page. Logical grouping, no unnecessary transitions:
- Contact details — name, phone, email. Three fields. Not five, not ten, not "enter date of birth for loyalty program".
- Delivery — select city → see methods with prices and terms. AJAX calculation via CDEK, Boxberry, Russian Post APIs. Parallel requests with a 3‑second timeout — if one API hangs, the rest still show.
- Payment — methods are filtered by selected delivery. Cash on delivery for pickup? We don't show it.
- Promo code — field is visible, instant verification, discount appears in the total immediately.
- Total — dynamic recalculation on any change. Change quantity → subtotal → delivery cost → total. No page reload.
Under the hood:
- Full AJAX — no reloads. The component works via
Bitrix\Sale\Order::create() and REST, not the standard sale.order.ajax.
- Real-time validation: not "fill the field correctly" but "phone: +1 (__) -".
inputmask mask + server-side check.
- Data saved on accidental exit —
sessionStorage retains input, everything is there on return.
- Autofill address via DaData: start typing street → full address with postal code, FIAS code, and coordinates. Fewer errors on the courier side.
- Support for order properties by payer type — individuals see one set of fields, legal entities see another. Toggle in the form.
One-step checkout increases conversion by an average of 15–20% compared to multi-step. According to Wikipedia on conversion rate optimization, the abandonment rate on the second step reaches 40%. Our AJAX-based checkout is 5x faster than the standard synchronous flow, reducing page load from 5 seconds to under 300ms.
How to recover abandoned carts?
Saving. Authorized users — cart in b_sale_basket, accessible from any device. Guests — cookie with TTL 30 days. FUSER_ID linked to cookie, cart does not disappear after an hour. Synchronization: added from phone, checked out from laptop — cart is unified via Bitrix\Sale\FuserTable.
Return. Email series: 3 emails. After 1 hour — reminder. After 24 hours — "your item is running out". After 72 hours — personal promo code for 5–10%. Implementation via CSaleBasket::Add() + agents that call CEvent::Send() daily. Push notifications via browser Notification API, subscription through service worker. Retargeting — cart data goes to Yandex.Direct via eCommerce events.
Abandonment analytics. At which step do they leave? If at delivery selection — price shock. If at payment — card declined, 3D-Secure fails. Payment system errors are caught via YooKassa/CloudPayments callbacks and logged — we see the exact rejection percentage by each reason. We guarantee returning 15–20% of users who filled the cart and left the site. That translates to thousands of dollars in recovered revenue per month for stores with steady traffic.
Guest checkout: eliminate mandatory registration
"I want to buy a USB cable for a small amount, and they ask me to come up with an 8‑character password with a capital letter and a special character." Mandatory registration kills 25–30% of conversion on small orders.
- Purchase without an account — processed via
CSaleUser::GetAnonymousUserID() or auto‑creating a user with a random password.
- After checkout — an email with login details. If they want, they activate the account; if not, they still get the order.
- Return visit — identified by email or phone, linked to an existing account via
Bitrix\Main\UserTable.
- Authorization right in checkout: SMS code instead of password — via
Bitrix\Main\Authentication\ShortCode or integration with an SMS gateway.
This approach boosts checkout completion from 70% to 85% on average.
Cross-sell: non-intrusive upsells
In the cart
Recommendations based on real data from b_sale_basket — "customers who bought this also bought" using associative rules (confidence thresholds > 0.3). Linked via infoblock property PROPERTY_ACCESSORIES. Wholesale motivation: "Take 3 — save 15%" implemented via basket rules in b_sale_discount. Free delivery threshold: "Add a certain amount and get free shipping". A simple widget that increases average order value by 10–20%.
Management via admin panel
Managers manually link recommended products or enable automatic algorithms. Display rules: category, price range, availability. A/B testing of different strategies — no developer needed.
Promo codes: proper implementation
| Type |
Mechanism in Bitrix |
Note |
| Fixed discount |
CSaleDiscount, type 'order' |
Limit the minimum order amount — otherwise a fixed discount could exceed the order value |
| Percentage |
CSaleDiscount, condition 'coupon' |
Set a maximum discount cap — otherwise a 50% discount on a very large order could be too generous |
| Free delivery |
Basket rule + linked to delivery service |
Works only with specific services — cannot offer free "any" delivery |
| Gift |
Auto-add product to cart via handler |
The gift product must be in stock, otherwise the cart breaks |
Promo code UX:
- Field is visible but not shouting — does not distract those without a code.
- Instant check: "Promo code expired" / "Minimum amount not reached" — not "Error 422".
- Discount shown as a separate line in the total.
- Can remove promo code and apply another.
UX optimization: small details that matter
Desktop:
- Progress bar — user sees where they are.
- Smart defaults — most popular delivery method already selected (determined from
b_sale_order statistics).
- Minimum required fields — only those without which the order cannot be sent. Middle name? Optional. Comment? Optional.
- Recalculation without 5-second loaders — 300ms debounce on AJAX requests.
Mobile:
- Large buttons — finger does not miss.
min-height: 48px per Google guidelines.
- Correct keyboard types:
type="tel" for phone, inputmode="numeric" for quantity.
- "Checkout" button fixed at bottom —
position: sticky.
- Collapsible sections — screen space on 375px is precious.
Error handling:
- "Check card number" instead of "Payment processing error".
- Auto-scroll to first error —
scrollIntoView({ behavior: 'smooth' }).
- "Item out of stock" — handled without losing filled data. Offer an alternative or remove with recalculation.
Integrations
-
DaData — address, full name, TIN. Suggestions as you type, FIAS validation.
-
Yandex.Maps — select pickup points on the map, geolocation for city detection.
-
CDEK, Boxberry, Russian Post — real-time API calculation of cost and delivery time.
-
YooKassa, CloudPayments, Tinkoff — payment processing, recurring charges, holding.
-
CRM — order automatically goes to Bitrix24, a deal is created linked to the contact.
-
Warehouse — real-time stock check via
CCatalogStoreProduct::GetList().
Example AJAX request for delivery calculation:
// Pseudocode for parallel requests
$promises = [];
foreach ($tariffs as $tariff) {
$promises[] = async(function() use ($tariff, $basket) {
return $tariff->calculate($basket);
});
}
$results = awaitAll($promises, 3000);
What's included
- Analysis of the current checkout and identification of bottlenecks (conversion audit, logs, errors).
- UX design: prototyping one-step form, approval with the client.
- Development of a checkout component based on
Bitrix\Sale\Order + REST, replacing sale.order.ajax.
- Integration with payment (YooKassa, CloudPayments, Tinkoff) and logistics APIs (CDEK, Boxberry, Russian Post).
- Setup of promo codes, cross-sell, abandoned carts.
- Testing on real scenarios: desktop, mobile, tablets.
- Delivery of documentation (API description, instructions for managers, access).
- Employee training on the new cart.
- Post-release support — 2 weeks of monitoring and fixes.
Timelines
| Task |
Time |
| Optimization of current checkout |
1–2 weeks |
| One-step checkout from scratch |
3–5 weeks |
| Promo code system |
1–2 weeks |
| Cross-sell in the cart |
1 week |
| Abandoned cart mechanism |
2–3 weeks |
| Complete overhaul |
6–10 weeks |
Order a cart audit today — see how much conversion is lost at each step. Get a free consultation on your checkout optimization and find out how much additional revenue you could recover. Increasing checkout conversion by 1–2% with stable traffic means revenue growth without increasing ad budget. The fastest ROI in e-commerce.