OpenCart product feeds

The file the channels read, kept current

Create a feed for one channel, one store and one language, say which of your own values go into each field the channel asks for, place your categories against Google's taxonomy once, and choose how often it regenerates. Google and Meta fetch it from a URL; Microsoft Advertising takes a file you download. What every field will produce for your own products is on the screen before you save, rather than in a rejection notice three days later.

Get it on the marketplace Read the documentation

A panel headed Feeds holding a table of three: “Google, main store” for Google Shopping, “Microsoft Advertising, weekly” for Microsoft Advertising, and “Meta, main store” for Meta, each on the store Fernbank Supply, in English. The first two are switched on and generated a minute ago; the third is switched off and reads Never. Under Delivery, the Google and Meta rows carry a read-only box holding a URL that runs off its right-hand edge, with copy and new-URL buttons beside it, while the Microsoft Advertising row carries a Download button instead. Each row ends with regenerate, preview, edit, duplicate and delete buttons.
Both deliveries on one screen: a tokenised URL for the two channels that fetch, a file for the one that does not. The box truncates the URL rather than the token (copying it is a button, not a selection), and a feed nothing has run yet says so instead of serving an empty file.

The channel’s own fields, against your own values

Each channel’s published field set, mapped one field at a time to a value your catalogue already holds, with a fallback literal for the products where that value is empty. A title the channel will cut short, a price its format refuses or a value it ignores is marked at the moment you map it. What the mapping produces for your own first three products is on the screen before you save, resolved by the same code that writes the file.

Google’s taxonomy, placed once

Put your categories against Google’s own taxonomy (bundled with the extension, so no key, no account and no network call) in one mapping every feed on that store and language reads. Unplaced categories inherit the nearest placed one above them, so mapping your top level produces a valid feed immediately, and a category Google has since retired sends the nearest live one above it instead of one Google no longer has. It proposes from your category names and applies none of it until you accept.

A bad night does not delist your catalogue

A run that fails leaves the previous feed serving byte for byte. A product that cannot be represented is left out and counted rather than taking the whole run down with it. Feeds are built in slices so a catalogue of any size finishes instead of meeting your host’s time limit, and pressing Regenerate again joins the run already going rather than starting a second one.

Delivered the way each channel takes it

Google and Meta are given a tokenised URL, served from outside the web root, answering a conditional request with a 304 rather than the whole file when nothing has changed. A new URL is one click away. Microsoft Advertising takes a file, so that feed gets a Download button, as can any feed for any channel. Regeneration runs on OpenCart’s own scheduler with nothing to install on the server: hourly, daily, weekly or monthly, which are the four cycles it understands, and the command line for exact times.

Whatever watches your store can read the runs

Product Feed answers an HTTP API (v1 today), so the system you already watch your store with can ask whether last night’s feed generated and what it dropped, instead of waiting for somebody to open the feed list: every feed and every run as JSON, what a run wrote, which field threw each product back, and a run nobody came back to reading as stalled. It only ever reads: nothing creates a feed through it and nothing regenerates one. It authenticates as an OpenCart API user you create yourself, answers only over HTTPS, and is off until you switch it on. A feed’s URL token is deliberately not readable through it. What will not change about it, and for how long, is written down.

Translation published, not claimed

Which of our strings a named native speaker has actually read is published per extension and per language, and anything unreviewed ships as English rather than as a blank or a raw identifier.

Everything it refuses to do sits on one page. Limits and guarantees says that nothing is pushed to a channel (there is no channel integration and no FTP upload, and Product Feed never holds a credential of yours), that there are three channels and no way to add a fourth, because a channel's fields and formats come from its own published specification, that it is one row per product and never one per variant, so a product with three sizes is one item, that the price in the file is your catalogue price with no tax added and no currency converted, that filtering is four include-lists and not a rule engine, that hourly is the finest cycle there is and a schedule is only as exact as your store's cron, that nothing is emailed when a run fails (it is on the feed list and in your store's error log), that a feed URL is not a login, since it hands your catalogue's public product data to whoever holds the token, and that removing the extension leaves its tables and its generated files where they are rather than deleting your data. Worth reading before you buy.

Questions people ask before buying

How do I get an OpenCart catalogue into Google Merchant Center?

Product Feed builds the file each channel asks for (one channel, one store, one language) from your own values placed against that channel's own fields, and regenerates it on the schedule you choose. Google and Meta fetch it from a URL; Microsoft Advertising takes a file you download.

What happens if a feed run fails overnight?

The file that is already published stays where it is. A bad night does not delist your catalogue, and whatever watches your store can read the runs.

Does it work with OpenCart 4?

Every Kyvero extension is built for OpenCart 4.x. Each one declares the lowest release it will install on and refuses to install below it, and its documentation lists the releases a full install-and-upgrade pass was run against.

Do I get the source code?

Yes. An extension is PHP on your own server: readable, not obfuscated, and with no remote licence check to fail. Your copy is yours to modify and to keep backed up.

Who answers when something goes wrong?

A developer, usually the one who wrote the extension. There are two official routes, the support portal and the support address, and both arrive in the same place.