1. What this module does

PriceWars turns your catalog into product feeds — XML files that Google Merchant Center, the Facebook / Instagram catalog (Meta), Ceneo and other platforms download to show your products, prices and stock. You can create as many feeds as you need: one per platform, language, currency or country, each with its own products, categories and prices.

Feeds available in version 1.0:

  • Ads and social — Google Merchant Center (Shopping ads and free listings) with the local inventory feed for your stores, Facebook / Instagram (Meta catalog), Pinterest;
  • Price comparison sites and marketplaces — Ceneo (with Ceneo categories or the shop's own), Morele.net Marketplace, Okazje.info, I-SZOP.pl and K-SZOP.pl (Poland); Grupa Domodi — Domodi, Homebook, Allani (Poland); Heureka.cz / Heureka.sk with the availability feed and Zboží.cz (Czech Republic, Slovakia); Skroutz (Greece); eMAG Marketplace (Romania, Hungary, Bulgaria); Compari.ro, Árukereső.hu and Pazaruvaj.com (Romania, Hungary, Bulgaria); Skąpiec.pl (Poland); ShopMania; idealo (CSV, Germany, Austria, United Kingdom, France, Italy, Spain, Poland); Awin (affiliate network, CSV); ChatGPT (OpenAI product feed, uploaded over SFTP);
  • Integrators and marketplaces for suppliers — Base.com (BaseLinker), Droplo, Media Expert (two versions of the supplier file), Mirakl marketplaces (offers file OF01: Carrefour, Decathlon, Empik, Conrad…);
  • Universal XML — a documented format with an XSD schema for partners, wholesalers and your own integrations;
  • Sitemap — products, categories, CMS and brand pages for search engines, with language versions (hreflang) and a sitemap index for large catalogs;
  • Custom template — any XML structure built from smart tags.

Before every release each format is checked against the official specification of its platform, and the module checks every file you generate against the same rules (Diagnostics). Skąpiec.pl, ShopMania, Base.com, Droplo and Media Expert publish no specification: their files follow the structure these platforms have accepted from shops for years — check the first import in the platform's panel.

Works with PrestaShop 1.7.8, 8.x and 9.x (PHP 7.2.5 or newer) and with multistore.

2. Installation

  1. Download the module from My account → Order history at addonspresta.com.
  2. In your Back Office, open Modules → Module Manager and click Upload a module.
  3. Drop the ap_pricewars_v1.0.1.zip file and wait for the confirmation.
  4. Open Catalog → PriceWars.

3. How it works

  1. Add a feed and choose its platform. The new feed starts with the settings the platform expects.
  2. In Category mapping choose which categories are exported and, for platforms with their own category tree (Google, Meta, Pinterest, Domodi, Ceneo, Heureka, Zboží.cz, I-SZOP.pl), the matching platform category. A category without its own choice takes the choice of its nearest parent, so mapping a main category covers all its subcategories.
  3. Copy the feed address from the list and paste it in the platform panel (Merchant Center, Commerce Manager, Ceneo panel).
  4. Set up the cron job so the file stays fresh (see "Generation").

The module calculates prices, stock and shipping costs with PrestaShop's own functions — the same values your customers see in the shop, with your taxes, specific prices and group reductions. Large catalogs are read in batches, so memory use stays low. The module sends your data nowhere by itself: the platforms download the feeds. The only exception is a feed for which you switch on Upload over SFTP (needed by ChatGPT): its file goes to the SFTP server you set.

4. Features and settings

Feed list

Catalog → PriceWars lists the feeds of the current shop with the number of offers and the date of the last file. The row actions open Category mapping, Diagnostics, Preview (the first 20 offers, nothing is saved), Generate now, Duplicate and Delete. Below the list you find the cron address and command.

Feed settings (tabs)

  • General — name (only for you), address name (e.g. google-pl, used in /feed/google-pl.xml), active.
  • Generation — Cached file (the file is reused for the lifetime you set), File only (written by cron or the command line — the fastest, required by platforms that need a static file) or Live (generated on every request); compression; Require the feed key to keep the feed private.
  • Language and currency — language, currency, country (taxes and shipping) and customer group (reductions). You may allow id_lang, id_currency and id_country in the address, so one feed serves several markets. This is off by default and accepts only a language active in the shop, a currency active and assigned to the shop and an active country; other values are ignored.
  • Stock and combinations — what to do with products out of stock, a stock correction and minimum, one offer per product or per combination, the combination name and id. Never change the id of a feed in use: the platforms identify offers by it.
  • Products — skip disabled, unorderable, virtual products and packs, products without a brand, reference, barcode or image; filters by visibility, condition, price and discount; lists of products, brands, suppliers or categories to export only or to exclude.
  • Name and description — letter case, a name template with smart tags (e.g. {brand} {name_base} {feature:5}), the description source (short, long, both or a template), HTML handling and length limits.
  • Images — size, number of images, combination images first.
  • Prices — which price is sent (with or without tax, before or after reductions), a price modifier such as 1.1 or {p} * 1.1 + 5, the price of the minimum quantity, and the lowest price of the 30 days before a promotion (Omnibus) for the platforms that ask for it, and the unit price for Google (from the unit price and unit set on the product, e.g. "per 100 g").
  • Shipping — no cost, the default, fastest or cheapest carrier, free shipping or a fixed cost; carriers to leave out, the delivery country, skip products no carrier delivers.
  • Links — UTM parameters (utm_source is required for the others to be added) and extra parameters.
  • Extra tags — XML added to every offer for fields the module does not write itself, e.g. <g:custom_label_0>. Switch on Use my own extra tags to write them; the custom template starts with a sample. XML node rules change the finished XML of every offer, one rule per line: remove g:mpn, set g:condition = refurbished if g:brand = Outlet, add g:custom_label_0 = {brand}, rename g:mpn => g:gtin, skip if g:availability = out_of_stock (conditions =, !=, contains, is empty, is not empty; a path such as images/image or an attribute @basket also works). Offers skipped by a rule are listed in Diagnostics.
  • Platform — the options of the chosen platform, e.g. identifier_exists, sale price and MPN for Google, Buy now (basket) and shipping time (avail) for Ceneo, change frequency and priority for the sitemap.
  • Advanced — subcategories inherit the mapping, the category of a product (main or deepest exported), log of skipped products.

Every field has a short help text under it. Values are checked when you save, and the form shows what to correct.

Smart tags

Names, descriptions, extra tags, UTM values and custom templates accept smart tags in braces, for example {name}, {name_base}, {brand}, {reference}, {gtin}, {price}, {price_regular}, {quantity}, {link}, {image}, {category}, {feature:ID}, {attribute:ID:separator}, {shipping_price}. Filters change a value: {name|upper}, {description_short|strip|truncate:200}. Names known from PriceWars II, such as {cecha:ID}, work too.

Category mapping

The Export column of each shop category is As parent, Yes or No. For platforms with a category tree you pick the platform category instead — type a few letters and choose from the list; a mapped category is exported, No leaves it out. Use the same choice in all subcategories copies a row down the tree. The two numbers next to a category count the products whose main category it is, and all its products.

The category lists of the platforms come with the module. When a platform changes its tree, click Download the current list under the table: the module fetches the list from the platform (Google, Ceneo, Heureka, Zboží.cz) and keeps it until a module update brings a newer one. I-SZOP.pl has a fixed list of six categories.

Mapping tools above the table: Every category + Apply to all sets one choice for every row (saved with Save); Copy the mapping of another feed of the shop (platform categories only between feeds of the same platform); Export CSV and Import CSV to edit the mapping in a spreadsheet — the columns id_category, state (inherit, yes, no) and platform_category_id; categories missing from the file keep their choice.

Diagnostics

The diagnostics page shows:

  • warnings about the configuration — for example a feed without mapping, catalog mode, an old file or a failed generation;
  • the specification check of the current file — every rule the file breaks, with the offer and the place in the platform documentation the rule comes from;
  • the skipped products of the last run with their reason (when Log skipped products is on);
  • statistics of the last 30 runs: offers exported and skipped, and the generation time (point at a bar for the numbers);
  • the recent runs with the number of offers, time and memory.

Preview → Product tester: enter a product ID to see whether the feed selects the product, why each offer is left out (for example Out of stock or Missing brand (required by the platform)) and the XML of each exported offer. Nothing is saved.

Settings for all feeds

Modules → Module Manager → PriceWars → Configure: short feed addresses, serving feeds in maintenance mode, export of products of the home category, products per batch, time and memory limits, how long statistics are kept. The Help box at the top links to this manual and to the module page at addonspresta.com.

Generation

Feeds in Cached file or File only mode need a cron job. The command line is the best choice:

php /path/to/shop/modules/ap_pricewars/bin/generate.php --shop=1

Run it every 15–60 minutes. Your host's control panel usually has a "Cron jobs" page; if it allows only addresses, use the cron address from the bottom of the feed list. Generate now writes a file at once.

5. Multistore

Each feed belongs to one shop. Select the shop in the Back Office header to see and edit its feeds; prices, stock, links and taxes come from that shop. The settings for all feeds are saved per shop or shop group. In the All shops or group context only an employee who manages every shop of it can save. One licence covers every shop of the installation.

6. Uninstall

Module Manager → PriceWars → Uninstall removes all feeds, mappings, statistics, generated files and settings. The feed addresses stop working. To keep everything, use Disable instead.

7. FAQ and troubleshooting

The feed is empty. Open Category mapping: no category is exported until you map one. Then check Diagnostics → Skipped products (switch on Log skipped products in the Advanced tab first).

Merchant Center reports a wrong price. Check the country and the customer group of the feed — the price is calculated for them. In the United States and Canada Google expects prices without tax, other countries with tax; the module does this automatically.

Ceneo rejects the categories. Use the Ceneo feed with category mapping, or Ceneo without category mapping to let Ceneo assign categories by itself.

The feed takes long or stops halfway. Use the File only or Cached file mode with the command-line cron job, and lower Products per batch if the server runs out of memory. When the server stops scripts after a few seconds (shared hosting), switch on Generate in steps: every cron call writes the next Products per step, and the file is replaced after the last step — run the cron job every few minutes.

A platform needs a field the module does not send. Add it in Extra tags with a smart tag, e.g. <g:material>{feature:7}</g:material>.

Heureka: which feed do I need? The Heureka.cz / Heureka.sk feed lists the products. Shops in the PPC mode can add the availability feed, which Heureka fetches every 10 minutes: use the same combination and category settings in both, because the ids must match. In the availability feed, Delivery days, Order deadline and Delivery hour add the guaranteed delivery time (working days only). Several carriers: in Carriers → DELIVERY_ID write pairs such as 12=PPL, 15=ZASILKOVNA (carrier reference from Shipping → Carriers).

Skroutz reports my links or images. Skroutz accepts only https addresses. To send sizes as variations and each colour as its own product, set the Size attribute group and Colour attribute group (the ids from Catalog → Attributes & Features) in the Platform tab.

eMAG asks me to map the fields. eMAG has no fixed file structure: in Products → Feeds of the eMAG panel map each element of the file to the eMAG field with the same name and your categories to eMAG categories.

Where do I put the Compari.ro address? In the Compari Centrul de clienti, under Datele magazinului → Sursa listei produselor; Árukereső.hu and Pazaruvaj.com have the same menu. Compari downloads the file once a day. Products in stock are sent with delivery time 1 ("In stock", the only value that allows the Compari Marketplace basket), others with the out-of-stock delivery time from the Platform tab. For electronics, IT, home appliances and LEGO fill in the products' MPN: Compari matches offers by the manufacturer's code.

Where does the GPSR data (manufacturer, responsible person) come from? From the addresses of your brands or suppliers (Catalog → Brands & Suppliers, the address of a brand or a supplier): company name (or the brand name), street, postcode, city and country are required; write the contact e-mail in the field Other. Switch on Send GPSR data in the Platform tab of a Ceneo or Heureka feed and choose whether the manufacturer is the brand or the supplier. For manufacturers outside the EU choose the Responsible person in the EU (for example your supplier, the importer). Safety warnings come from a product feature you choose by its id.

How do I send products to ChatGPT? OpenAI takes product feeds only by upload to an SFTP server it gives you after approving your shop. Add a ChatGPT feed and fill in Upload over SFTP in the General tab: host, user, password, the file name OpenAI expects (products.csv.gz by default) and the server key fingerprint (MD5, or SHA256:… as ssh-keygen -l prints it). The upload stops when the server presents another key. After a change of the host, port or user type the password again. Every generation by cron then uploads the whole catalog of the feed; a failed upload is shown in Diagnostics with the run.

I used SEIGI PriceWars II. Can I move my feeds? Yes: Catalog → PriceWars → Import from PriceWars II lists the feeds of PriceWars II in the shop. The import creates the feeds with their format, the settings that have an equivalent here and the category mapping; PriceWars II is not changed. With Name the new feeds pw2-N the page shows Apache and nginx rules that redirect the old addresses (modules/pricewars2/service.php?id_xml=N) to the new feeds, so the platforms keep working. Read the report: settings without an exact equivalent are listed there — check them and generate each feed before you switch.

How do I give a wholesaler a feed with their prices? Switch on B2B links in the Language and currency tab of the feed, then in Diagnostics → B2B links create a link for a customer group (for example Wholesale) or for one customer (ID or e-mail). The link carries a signature: the feed is sent with the reductions of that group and the specific prices of that customer. Each link shows its last download; Revoke stops one link, Revoke all links changes the signature of the feed so every old link stops working. Employees without access to Customers see only the customer ID and create links by ID.

Okazje.info or Zboží.cz do not show my promotion. Both need the lowest price of the 30 days before the promotion (Omnibus directive). The module records the prices every time a feed is generated and keeps them for 400 days, so it knows that price only after the feed has been generated during those 30 days — set the cron job to at least once a day. Until then the promotion is sent as a normal price. The price history is kept per shop, currency, country and customer group, and the option is in the Prices tab (Lowest price before the promotion, on by default). The smart tag {omnibus_price} gives the same price to any other platform.

The address /feed/….xml returns "page not found". Turn on friendly URLs in Shop Parameters → Traffic & SEO or use the address with index.php, and make sure the feed is active.

8. Updates and support

Updates are free for life: download new versions from My account → Order history at addonspresta.com and upload them like a new module. Your feeds and settings are kept. New platforms come with free updates.

Support is included for 12 months from your order: write to mail@addonspresta.com or use the contact form at addonspresta.com (Monday to Friday, 10:00–16:00 CET; we usually answer within 2 business days). Please include your PrestaShop version, the module version and a screenshot of the feed's Diagnostics page.

Back to User manuals

Loading...
Back to top