# Google Merchant Center and Meta Feeds for GoCommerce

> Publish a GoCommerce catalogue as a Google Merchant Center RSS feed and a Meta catalogue CSV: one item per variant, built live from the catalogue.

- Canonical: https://kitcommerce.store/integrations/feeds/
- Last updated: 2026-09-25

---

Marketing

## Google Merchant Center and Meta feeds for GoCommerce

A Go package that publishes the catalogue in the shapes advertising platforms read: Google Merchant Center’s RSS feed at /x/feeds/google.xml and Meta’s catalogue CSV at /x/feeds/meta.csv. One item per variant, built from the live catalogue on each request. One setting is required — where the storefront lives.

- **Marketing** module
- **4** settings
- **3** tests
- **3** API operations
- **ext/feeds**

### What it does

In the package’s own words, a feed is “the storefront’s products, one item per variant, with the fields those platforms require and nothing they do not: an id, a title, a price in the store’s currency, a link to the product page, a picture, availability, a brand, and the group that ties a product’s variants together.”

Both feeds are generated on request from the live catalogue, so a platform that fetches daily sees yesterday’s prices only for a day. There is no build to schedule; a response may be cached for 15 minutes. Each item carries the SKU as its id and MPN, the barcode as its GTIN, the category path as the Google product category, and the weight where the variant has one.

The storefront’s address is a setting, because the engine does not know where its storefront lives. Product links are built from it and a path pattern; pictures the store holds itself are given the request’s own host, so the platform can fetch them. The admin’s Feeds screen counts what the feed holds and the items missing a picture, a brand or an identifier — what the platforms most often reject.

### Configuration

One setting is required: the storefront URL. Set it in Config — the reference binary’s -feeds flag reads it from STOREFRONT_URL — or on the Plugins screen, which wins.

*Product feeds module settings — 4 settings, 1 required*

| Setting | Environment variable | Required | What it does |
| --- | --- | --- | --- |
| `StorefrontURL` Storefront URL | `STOREFRONT_URL` | Yes | Where product pages live, without a path: https://shop.example. Until it is set, both feeds answer 409 and say what to set. |
| `ProductPath` Product page path | — | No | The product page’s path with {slug} in it, /products/{slug} by default. Set it on the Plugins screen: the panel field’s default stands in front of Config, so Config.ProductPath is never read. |
| `Brand` Brand when a product has no vendor | — | No | The brand an item names when its product has no vendor. |
| `google_product_category` Default Google product category | — | No | Used when a product has no category of its own. Panel only; there is no Config field for it. |

The module reads its Config struct, not the environment. The variable names are the ones the package’s own example or the reference binary uses; in your own `main()` you choose where each value comes from. Where a setting has a panel label, the admin’s settings drawer can hold it too, and a value typed there wins over Config.

### Setting it up

1. **Install the module** — Pass feeds.New to gocommerce.New, as below, or start the reference binary with -feeds and STOREFRONT_URL set.
2. **Say where the storefront is** — With a storefront URL in Config the plugin starts switched on. Otherwise enable Product feeds on the Plugins screen and set it there, with the product path if yours is not /products/{slug}.
3. **Read the Feeds screen** — It counts items, products and stock, and the items missing a picture, a brand or an identifier. Fix those before a platform rejects them.
4. **Give the platforms the URLs** — https://your-api-host/x/feeds/google.xml for Merchant Center and /x/feeds/meta.csv for Meta’s catalogue, each fetched on the platform’s own schedule.

main.go

```
import (
	"os"

	"github.com/itswadesh/gocommerce/core"
	"github.com/itswadesh/gocommerce/ext/feeds"
)

app, err := gocommerce.New(cfg, feeds.New(feeds.Config{
	StorefrontURL: os.Getenv("STOREFRONT_URL"),
}))
```

The package doc has no example of its own; this is how the reference binary’s -feeds flag and examples/store/main.go install it. cfg is your gocommerce.Config. Import path `github.com/itswadesh/gocommerce/ext/feeds`.

### How it works

- **One item per variant**

  Every active variant of every active product becomes an item. Variants of one product share an item group id; a variant with its own label gets it in the title and ?variant=\<SKU> on the link.

- **Prices in minor units, written out**

  Prices are written in the store’s currency with the right number of decimals — none for yen, three for dinar. A compare-at price above the price makes the price the sale price.

- **Availability from stock**

  An item is in stock when its variant can sell one. Meta’s quantity column carries the available count, or 999 for a variant that does not track inventory.

- **Off is a 404, unset is a 409**

  With the plugin off, both feed URLs answer 404. On but without a storefront URL, they answer 409 and name the setting, rather than serving links to nowhere.

- **A status that goes and looks**

  GET /api/admin/x/feeds/status walks the same catalogue the feeds do and counts items, in and out of stock, and what is missing — so the screen and the feed cannot disagree.

- **No tables**

  The module keeps no state of its own. Every fetch reads the catalogue; nothing is stored between them.

### What it does not do

Read these before an order depends on it. No store is known to run GoCommerce in production yet, so these come from the code, not from anyone’s experience.

- **Base price, all channels** — Items carry each variant’s base price. Price lists are not applied, and every active product is listed whatever channels it is published to.
- **Always new** — Every item’s condition is new. There is no field for used or refurbished stock.
- **Built on every fetch** — Each request walks the whole active catalogue. For a large catalogue that is real work per fetch, softened only by the 15-minute cache header.
- **Public URLs** — The feeds are open to anyone who knows the address: prices, stock counts and SKUs for the whole active catalogue.
- **Config.ProductPath is ignored** — The panel’s product-path field has a default of its own, and the module reads the panel first — so a path set only in Config never takes effect. Set it on the Plugins screen.
- **Two formats** — Google Merchant Center’s RSS and Meta’s CSV. Other platforms that read one of those formats may take them; no other format is produced.

FAQ

### Questions about the Product feeds module

**What are the feed URLs?**

GET /x/feeds/google.xml for Google Merchant Center and GET /x/feeds/meta.csv for Meta’s catalogue, both on the host that serves your GoCommerce API. They answer only while the plugin is switched on and a storefront URL is set.

**How fresh are the prices?**

As fresh as the fetch. Nothing is pre-built: each request reads the live catalogue, and the response may be cached for 15 minutes. A platform that fetches daily is at most a day behind.

**Why was an item rejected for a missing identifier?**

Google takes a GTIN, or a brand and an MPN together. The feed sends the SKU as the MPN, so the item at risk is one with no barcode and no brand — a product with no vendor, in a store with no default brand set. The Feeds screen counts them.

**Does it upload anything to Google or Meta?**

No. It serves two URLs; the platforms fetch them on their own schedule. There are no Google or Meta credentials to configure, and none are stored.

### Source

Everything on this page is read from [`ext/feeds`](https://github.com/itswadesh/gocommerce/tree/main/ext/feeds) in the GoCommerce repository, MIT licensed. When this page and the code disagree, the code is right and this page is out of date.Google Merchant Center and Meta are trademarks of their owners; this module publishes feeds in their documented formats and implies no endorsement. See [trademarks](https://kitcommerce.store/about/#trademarks).

- [ext/feeds on GitHub](https://github.com/itswadesh/gocommerce/tree/main/ext/feeds)
- [All GoCommerce modules](https://kitcommerce.store/integrations/)

### Try it against a store of your own

The one-command stack gives you GoCommerce’s API and admin on your own machine in minutes. Add this module to it and try it on test orders before a real one depends on it.

[Deploy in minutes](https://kitcommerce.store/#one-command) · [Read the module](https://github.com/itswadesh/gocommerce/tree/main/ext/feeds) · [All integrations](https://kitcommerce.store/integrations/)
