Skip to content

Settings

Product Feed keeps its settings in OpenCart's own setting table, under the module_product_feed group. You set them at Admin > Extensions > Extensions > Modules > Product Feed.

Each key below carries where it applies. per store means a multi-store install can hold a different answer per storefront, and both are honoured: a read takes what that store holds, then what the default store holds, then the shipped default. install-wide means one thing serves every storefront, and the key's own description names that one thing.

Scope

Key Default What it does
module_product_feed_status
install-wide
0 Whether the module is enabled. Set either from Extensions > Modules or from the Status switch on Product Feed's own screen, which write the same key. Off, nothing generates: the scheduled pass stops before it looks for a due feed, and the feeds you have keep whatever file they last wrote. Read once for the whole installation rather than per store, because what it governs is the store's own scheduler, which runs on no storefront's hostname.
module_product_feed_api_enabled
install-wide
0 Whether the extension answers API requests at all. Off, every API route answers 404 api_disabled in the API's own JSON envelope, so an extension with its API off is shaped like one that has none. Read once for the whole installation rather than per store, because the credential it checks is OpenCart's own API user, which has no store of its own. It is a separate switch from Status: an installation may want its feeds generating and no API, and — because the two are read independently — the API answers whether or not Status is on, which is deliberate. What a feed last wrote and why a product was left out is the merchant's record, and a switch that stops generation should not hide it. The API only ever reads: nothing can add a feed, edit one, rotate a secret or start a generation through it.

Retention

Key Default What it does
module_product_feed_runs_kept
install-wide
20 How many generation runs are kept for each feed. Older ones go, with their rejection rows, as a new run opens — so a feed that has just run keeps this many including the one that has just finished. A weekly feed wants more of this history and an hourly feed on a small host wants less. Between 1 and 500; a number outside that is saved as the nearest one inside it. Read once for the whole installation rather than per store, because the one thing it serves is the run table every feed writes into.

Feeds

feed — install-wide

One row per feed, and this is where nearly everything a merchant configures about Product Feed actually lives. Added and edited on the feed's own form. Install-wide because the storefront a feed prices for is a column of the row rather than a property of whoever is looking at it: one installation runs a Google feed for store 1 and a Meta feed for store 2 out of the same list.

  • name — What you call the feed. Yours entirely: it names the download, it is the title Google and Meta XML feeds carry, and the API returns it. Starts at empty.
  • channel — Which channel the feed is written for, which decides the file format, the fields it may carry and which of them are required. On the channels page. Starts at empty.
  • store_id — Which of your stores the feed describes: its catalogue, its prices and the web address every link in the file points at. Starts at 0.
  • language_id — Which language the names, descriptions and category paths are taken in. Starts at 0.
  • currency — The currency code the prices are sent with. Empty is the store's own. On its own it is only the label on the number; whether the number is converted into it is the switch below. Starts at empty.
  • convert_currency — Whether every price the feed sends is multiplied by the feed currency's rate in the store's own currency table, after tax, the way the storefront converts. Off, the catalogue's own numbers go out under the feed's currency code, which is what every feed did before 1.6.0. A feed converting into a currency the store has no rate above zero for fails its run with that reason, and the previous file keeps serving. Starts at 0.
  • status — Whether this feed is live. Off, it is not generated on its schedule and its hosted URL answers as though it were not there. Starts at 0.
  • secret — The token in the feed's own URL, rotated from a button on the form. Empty is the answer for a channel you download the file for rather than one that comes and fetches it — there is no second switch saying whether the URL is on. Starts at empty.
  • mapping — Which of your own values fills each of the channel's fields, with a fallback per field for the products that resolve to nothing. Set on the Fields tab; what you may map from is on the sources page. Whether a price includes tax is chosen here too, by mapping a price field from Price including tax or Special price including tax rather than by a switch, and a variant's colour or size by mapping a field from one of your store's options under Variant options. Starts at empty.
  • filters — Which products the feed leaves out — by category, by stock, by price, by status — and the categories, brands and individual products it leaves out whatever those let in. An exclusion wins over every include; a category is left out exactly as ticked, without the ones below it; one row both included and left out is refused on save, and so is a product list past its cap. Set on the Filters tab. Starts at empty.
  • cycle — How often the feed regenerates on its own: hourly, daily, weekly or monthly. Empty is by hand only. The four are OpenCart's own, because the thing that wakes Product Feed up is the store's own cron; see how often a feed regenerates. Starts at empty.
  • schedule_status — Whether that cycle is acted on. Off keeps the cycle you picked while pausing it, which is what a merchant who wants a fortnight off actually wants. Starts at 0.

category_map — install-wide

One row per category you have placed against Google's taxonomy, shared by every feed on the same store and language rather than kept per feed — which is what stops a merchant mapping the same few hundred categories once per channel. Set on the Categories tab, a row at a time. There is no store-wide default. A category with no row of its own sends the mapping of its nearest mapped parent, and the Categories tab says which category answered; a row of its own always wins over a parent's.

  • taxonomy_id — The number Google gives the taxonomy entry you chose. This is what the feed sends. Starts at 0.
  • taxonomy_path — The full taxonomy path as it read the day you chose it, kept as a snapshot and never rewritten by an update — so a mapping Google has since retired can still tell you what it used to mean. Starts at empty.
  • taxonomy_version — Which release of Google's taxonomy that snapshot was taken against. Starts at empty.
  • taxonomy_locale — Which bundled taxonomy file you were browsing when you chose it. Derived from the language rather than picked: which file a language lands on is on the sources page. Starts at empty.

Advanced

Key Default What it does
module_product_feed_conserve
install-wide
0 Trades throughput for a quieter server: smaller slices with a rest between them, so a shared host is not held for as long by one generation request. Read once for the whole installation rather than per store, because the one thing it serves is the server every feed generates on — a merchant on shared hosting is on shared hosting for every feed they run.
module_product_feed_diary_verbose_until
install-wide
0 When detailed logging stops, as a unix timestamp, and 0 is off. Turning Detailed logging on from this extension's settings form stores the moment two days from now; the writer compares that against the clock every time it is asked for a DEBUG line, so the window closes on its own with no scheduled task and nothing to clean up. While it is open this extension records what it did in far more detail, and the shared diary consequently holds less history.

What you cannot change, and why

These are fixed on purpose. Each one is a decision with a reason beside it rather than a setting nobody got round to adding.

Advanced

Conserving resources is one switch for the whole installation and there is deliberately no per-feed override. The resource being conserved is the server's, and a merchant who set one feed to run flat out while the installation-wide switch said otherwise would have configured a contradiction the screen cannot explain.

Feeds

When the list calls a feed overdue is not a setting. It is the feed's own cycle plus a fixed grace, so the threshold moves with the cycle you chose: an hourly feed on a store whose cron runs once a day is not called out for being on time, and a monthly feed is not two months stale before anybody is told. A merchant tuning this would be tuning away the warning rather than the lateness.

Rule Value
Grace on top of the feed's own cycle, in seconds 86400

How the Suggest button scores a category against Google's taxonomy is fixed. The two numbers behind it are ones a merchant has no basis to choose, and every support conversation about a configurable one begins with what did you set it to. What is configurable is the mapping itself: every suggestion is a proposal you accept or reject, and nothing the heuristic produced reaches a channel unaccepted.

Rule Value
Share of the score that leaf agreement is worth, as a percentage 70
Confidence below which nothing is proposed, as a percentage 55

How many products one feed may leave out by name is fixed, and saving more is refused. The cap keeps the filter set inside the column that holds it and the statement that reads it bounded, and a merchant past it is describing a category or a brand one product at a time — which the Leave out tick on those lists says in one click.

Rule Value
Products one feed may leave out by name 1000

Tax is worked out at the feed store's own address, as a guest of that store sees it: its country and zone, its default tax address rule and the default customer group. There is no picker for another country, because that would send a price no shopper on your storefront is ever shown. A store selling across borders under the EU's one-stop shop sends its home rate.

The conversion rate is whatever the store's own currency table holds, as its currency auto-update or a person last wrote it. Product Feed fetches no rates of its own: that would be a dependency on a service outside the store, and a second rate beside the one the storefront charges at.

A feed's secret is a column of the feed's own row and is deliberately not copied into the table that remembers your settings across an update. A copy would outlive an uninstall in a table nothing drops, and it must survive an update on its own account anyway: a secret rotated by accident is a channel dashboard to go and re-paste a URL into, on a feed that is delisted until somebody does.

Rule Value
Bytes of randomness behind a feed secret 32