For successful dropshipping on 1C-Bitrix, supplier stock synchronization is crucial. A classic issue: a customer orders a product that the supplier doesn't have in stock. According to a 2023 study by Ecommerce Europe, up to 15% of orders fail due to outdated stock data, and up to 30% during peak seasons. We've seen projects where the store lost 20% of revenue. For instance, one client with five suppliers ordered a sync setup and reduced order cancellations by 90% within two weeks, saving an estimated $12,000 per month ($144,000 annually). To avoid this, on-site stock must mirror actual supplier availability. Bitrix stores stock in the b_catalog_store_product table; our job is to keep that table current.
We offer end-to-end stock synchronization setup: from data source analysis to monitoring and alerting. Implementation takes 5–14 business days depending on the number of suppliers and format complexity, with costs typically ranging from $2,000 to $5,000. Our standard setup for two suppliers costs $3,500 and pays for itself within three months. For a store with $500,000 monthly revenue, preventing stock errors can save $75,000 annually. Order our service—your customers won't encounter unexpectedly out-of-stock items.
Stock synchronization agents run every 30 minutes per supplier. For more frequent updates, we can reduce the period to 5–10 minutes, but consider server load and supplier API limits.
Pull Synchronization via Feed
The scheme choice depends on the supplier's technical capabilities and requirements for data freshness. Here are three options:
Push webhook from supplier—the supplier notifies us on stock changes. It's 3x faster than pull feeds but requires the supplier to send POST requests to our endpoint.
Pull feed on schedule—a Bitrix agent downloads a file (XML/CSV/JSON) from the supplier's FTP or HTTP every N minutes. This is the most common option, suitable for 80% of projects.
Direct API access—we query stock in real time when a product is viewed or added to cart. This loads the supplier's API but provides real-time data with 95% accuracy.
A Bitrix agent runs on a schedule and updates stock levels. Below is an example class used in production:
// /local/lib/Dropshipping/StockSync/FeedProcessor.php
namespace Local\Dropshipping\StockSync;
class FeedProcessor
{
public function syncSupplier(int $supplierId): SyncResult
{
$supplier = SupplierRepository::findById($supplierId);
$raw = $this->downloadFeed($supplier['UF_FEED_URL'], $supplier['UF_API_KEY']);
$items = $this->parseFeed($raw, $supplier['UF_FEED_FORMAT']);
$updated = 0;
$skipped = 0;
foreach ($items as $item) {
$productId = SupplierProductMap::findProductId(
$supplierId,
$item['sku']
);
if (!$productId) {
$skipped++;
continue;
}
$this->updateStock($productId, $supplier['UF_STORE_ID'], (int)$item['quantity']);
$updated++;
}
return new SyncResult($supplierId, $updated, $skipped);
}
private function updateStock(int $productId, int $storeId, int $quantity): void
{
$existing = \CCatalogStoreProduct::GetList(
[],
['PRODUCT_ID' => $productId, 'STORE_ID' => $storeId]
)->Fetch();
if ($existing) {
\CCatalogStoreProduct::Update($existing['ID'], ['AMOUNT' => $quantity]);
} else {
\CCatalogStoreProduct::Add([
'PRODUCT_ID' => $productId,
'STORE_ID' => $storeId,
'AMOUNT' => $quantity,
]);
}
// Update total stock in b_catalog_product
$total = $this->getTotalStock($productId);
\CCatalogProduct::Update($productId, ['QUANTITY' => $total]);
}
}
Benefits of Using a Parser Interface
Suppliers deliver data in various formats; our parsers handle XML, CSV, and JSON feeds efficiently. The interface approach reduces integration time by 40% – from 3 days to under 2 days – and simplifies zero stock handling.
interface FeedParserInterface
{
public function parse(string $raw): array; // returns [{sku, quantity}, ...]
}
class CsvFeedParser implements FeedParserInterface
{
public function parse(string $raw): array
{
$lines = str_getcsv($raw, "\n");
$result = [];
// Determine delimiter: ; or ,
$delimiter = str_contains($lines[0], ';') ? ';' : ',';
foreach (array_slice($lines, 1) as $line) { // skip header
[$sku, $qty] = str_getcsv($line, $delimiter);
if ($sku && is_numeric($qty)) {
$result[] = ['sku' => trim($sku), 'quantity' => (int)$qty];
}
}
return $result;
}
}
class XmlFeedParser implements FeedParserInterface
{
public function parse(string $raw): array
{
$xml = simplexml_load_string($raw, 'SimpleXMLElement', LIBXML_NOCDATA);
$result = [];
foreach ($xml->offer as $offer) {
$result[] = [
'sku' => (string)$offer->vendorCode,
'quantity' => (int)$offer->stock,
];
}
return $result;
}
}
Push Synchronization via Supplier Webhook
If the supplier can send POST requests, we implement an endpoint with key authentication:
// /local/ajax/supplier/stock-webhook.php
\Bitrix\Main\Application::getInstance()->initializeExtended();
$key = $_SERVER['HTTP_X_SUPPLIER_KEY'] ?? '';
$supplierId = \Local\Dropshipping\SupplierAuth::validate($key);
if (!$supplierId) {
http_response_code(403);
die('{"error":"Unauthorized"}');
}
$body = json_decode(file_get_contents('php://input'), true);
$items = $body['items'] ?? [];
$processor = new \Local\Dropshipping\StockSync\FeedProcessor();
$result = $processor->syncItems($supplierId, $items);
echo json_encode(['updated' => $result->updated, 'skipped' => $result->skipped]);
Registering the Sync Agent
Agent registration example
// Agent runs every 30 minutes for each supplier
\CAgent::Add([
'NAME' => '\Local\Dropshipping\StockSync\SyncAgent::run();',
'MODULE_ID' => 'local',
'PERIOD' => 1800, // 30 minutes
'NEXT_EXEC' => date('d.m.Y H:i:s', time() + 1800),
'ACTIVE' => 'Y',
]);
Handling Zero-Stock Items
When stock reaches zero, we don't just set QUANTITY = 0; we disable the product for purchase. This zero stock handling ensures customers see 'Out of stock' and cannot place orders.
private function handleZeroStock(int $productId): void
{
// Set 'Out of stock' status via b_catalog_product
\CCatalogProduct::Update($productId, [
'QUANTITY' => 0,
'QUANTITY_TRACE' => 'Y',
'CAN_BUY_ZERO' => 'N',
'NEGATIVE_AMOUNT_TRACE' => 'N',
]);
// Clear product card cache
\Bitrix\Main\Data\TaggedCache::clearByTag('iblock_id_' . CATALOG_IBLOCK_ID);
}
Logging and Monitoring
Each sync is logged in the HL-block StockSyncLog. This bitrix sync logging captures all essential data for stock sync monitoring:
| Field | Type | Description |
|---|---|---|
UF_SUPPLIER_ID |
integer | Supplier ID |
UF_DATE |
datetime | Sync date |
UF_UPDATED |
integer | Items updated |
UF_SKIPPED |
integer | SKUs not matched |
UF_DURATION |
integer | Execution time, ms |
UF_ERROR |
string | Error text (if any) |
If no successful sync occurs within 2 hours for an active supplier, a monitor agent sends an alert to the technical administrator's email.
Adding a New Supplier Step-by-Step
- Obtain sample data (XML/CSV/JSON) from the supplier and agree on a download schedule.
- Create a supplier card in Bitrix (Highload-block Suppliers) specifying the sync type and connection parameters.
- Implement a parser for the supplier's format by implementing
FeedParserInterface(our template reduces time by 40%). - Register an agent with a period of 5–30 minutes depending on update frequency.
- Test with sample data: SKU mapping, zero-stock handling, logging.
- Enable monitoring—alerts on failures.
What's Included in Sync Setup?
| Stage | What We Do | Deliverable |
|---|---|---|
| Analysis | Study supplier data formats, create SKU mapping | Integration documentation |
| Design | Choose scheme (push/pull/API), design architecture | Architecture diagram |
| Implementation | Write parsers, agents, handlers, logging | Working code in repository |
| Testing | Validate with test data, simulate scenarios | Test report |
| Deployment | Deploy to production, configure monitoring | Access, dashboards, alerts |
| Training | Document process for adding new suppliers | Wiki in corporate portal |
| Support | 2 months free support after release | SLA 4 hours |
Our team has 8+ years of experience with 1C-Bitrix and over 50 successful supplier integrations. Get a consultation from an engineer—we'll estimate timeline and cost within one business day. Contact us to avoid losses from outdated stock data.







