When you have 10,000 products in your catalog and your supplier sends a daily Excel price list, updating manually wastes time and invites errors.
We automate this process: fetch the file, parse it, update prices and stocks without human intervention. A full integration takes 4 to 6 business days per supplier. Manually updating 1,000 items takes hours—and typos and missed rows are common. Automation eliminates human error and frees resources for higher-value tasks.
How automation reduces costs
Manual update of 1,000 items takes 2–3 hours, with inevitable errors. Automation cuts time to zero and reduces errors by 95%. Once configured, the process runs for years. Our client with 15,000 SKUs saves 40 hours per month—tens of thousands of rubles monthly. Payback period is 2–3 months. For a store with 50,000 products, benefits scale: time savings can exceed 100 hours per month.
How we fetch price lists from different sources
Email with attachment is the most common scenario. We connect to the mailbox via IMAP, search for emails from the supplier by subject or sender, and download the attachment. For security, we use a separate mailbox or folder.
$imap = imap_open('{mail.imap.example.com:993/imap/ssl}INBOX', $user, $pass); $emails = imap_search($imap, 'FROM "[email protected]" UNSEEN'); foreach ($emails as $num) { $structure = imap_fetchstructure($imap, $num); // extract attachment } FTP/SFTP—we download the file daily on a schedule, compare the modification date with the previous run. If unchanged, we skip. HTTP URL—supplier publishes a price list via a link with Basic Auth. All options are supported out of the box.
| Source | Protocol | Update Frequency | Setup Complexity |
|---|---|---|---|
| IMAP | on arrival | low | |
| FTP | FTP/SFTP | on schedule | medium |
| HTTP URL | HTTP | on request | low |
How to set up column mapping for any format
Problem: each supplier has a different format—SKU sometimes in column B, sometimes in D; header rows range from 2 to 5. Solution—configurable mapping stored in a Highload-block:
supplier_id: 42 sku_column: B # SKU in column B price_column: D # price in column D qty_column: F # stock in column F header_rows: 3 # first 3 rows are header To read Excel files, we use PhpSpreadsheet (successor of PHPExcel):
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($filePath); $sheet = $spreadsheet->getActiveSheet(); $rows = $sheet->toArray(); If the supplier changes the format, edit the mapping. For 50,000+ SKUs, we build a reverse index in memory when the worker starts: load all SKU mappings once to avoid DB hits.
How to update prices and stocks via Bitrix API
Prices in Bitrix are stored in the b_catalog_price table. Each price type is a separate record. We update them via API:
$priceType = CCatalogPriceType::GetList([], ['NAME' => 'Purchase price'])->Fetch(); CCatalogProduct::SetPrice($elementId, $priceType['ID'], $price, 'RUB'); // markup for retail price $retailPrice = $supplierPrice * $supplier->getMarkupCoefficient(); Stocks are in b_catalog_store_product. If warehouses are not used, we update QUANTITY directly:
CCatalogStoreProduct::Update($storeProductId, ['AMOUNT' => $qty]); Identification of products by SKU: we store correspondences in an infoblock property SUPPLIER_SKU or in a Highload-block SupplierMapping. For 50,000+ SKUs, we use in-memory cache.
Comparison of manual vs automated import
| Parameter | Manual import | Automated import |
|---|---|---|
| Time for 1,000 items | 2–3 hours | 2–3 minutes |
| Errors | 5–10% | <0.1% |
| Update frequency | once per week | up to 24 times per day |
| Monthly cost | 40 hours | 0 hours |
Automation is 50 times faster and 100 times more accurate than manual work.
What's included in the integration setup
- Analysis of data sources and current price list format
- Development of column mapping configuration for each supplier
- Setup of file retrieval (email/FTP/HTTP) and the agent for processing
- Implementation of price and stock updates via Bitrix API, accounting for trade catalogs and warehouses
- Creation of error logging and notification system (Telegram, Email)
- Delivery of documentation: architecture description, instructions for adding a new supplier, support contacts
- Operator training: how to recognize a failure and what to do when the format changes
- Integration support for one month after launch
Typical import errors and how to avoid them
File format change. Supplier didn't warn and the parser fails. Logging records errors, we get a notification and quickly fix the mapping. For critical suppliers, we set up a fallback parser.
Duplicate SKUs. One SKU can appear in two products. Solution: check SKU uniqueness before import. If duplicate, stop the process and send an alert.
Incorrect prices. Sometimes the supplier makes a mistake in the file. We check for a valid price range: if the price changes by more than 30%, the process pauses and requires confirmation.
| Price list size | Number of rows | Processing time | Peak memory |
|---|---|---|---|
| 2 MB | 5,000 | 7 seconds | 256 MB |
| 10 MB | 25,000 | 35 seconds | 512 MB |
| 50 MB | 120,000 | 3 minutes | 1.5 GB |
For stores with frequent price changes and large assortments, automation is the only way to stay current. Contact us to evaluate your project. We will analyze your suppliers' price lists and propose the optimal architecture. Get a consultation on import automation—we'll show you how to speed up catalog updates tenfold.

