Product Feeds (Google Shopping)¶
Merchello can generate XML product feeds for Google Shopping (Google Merchant Center). You configure feeds in the backoffice with language, country, and currency targeting, and Merchello generates compliant XML that Google can consume. Feeds are rebuilt automatically on a schedule and served via public URLs.
How It Works¶
A product feed is a configuration that defines:
- Which products to include (via filters on product type, collection, or custom criteria)
- How to format the data (country, currency, language)
- Whether to include tax in prices
- Custom labels and custom fields for Google Ads campaign segmentation
Each feed has a slug that forms part of its public URL. You create and manage feeds in the Umbraco backoffice under Settings > Product Feeds.
The feed generators live in Merchello.Core/ProductFeeds/Services (GoogleProductFeedGenerator, GooglePromotionFeedGenerator) and the public controller is ProductFeedsPublicController.
Public Feed URLs¶
Once a feed is configured and enabled, it is served at a public URL that you submit to Google Merchant Center. These routes are served via the Storefront API (not the backoffice management API):
| URL | Description |
|---|---|
/api/merchello/feeds/{slug}.xml |
Main product feed (application/xml) |
/api/merchello/feeds/{slug}/promotions.xml |
Promotions feed (application/xml) |
/api/merchello/feeds/auto-discount/active |
Active Google auto-discount payload (returns 204 No Content when none active) |
For example, a feed with slug us-shopping would be accessible at:
Submit this URL to Google Merchant Center as your product data feed.
Feed Properties¶
| Property | Default | Description |
|---|---|---|
Name |
-- | Display name in the backoffice |
Slug |
-- | URL-safe identifier used in the public feed URL |
CountryCode |
US |
Target country for the feed |
CurrencyCode |
USD |
Currency for prices |
LanguageCode |
en |
Language for product titles and descriptions |
IncludeTaxInPrice |
null | Whether prices include tax (null = use store default) |
IsEnabled |
true | Whether the feed is active |
Promotions Feed¶
In addition to the main product feed, Merchello can generate a promotions feed for Google Merchant Promotions. This includes:
- Manual promotions -- explicitly configured promotional offers
- Auto-discount integration -- automatic discounts surfaced as Google promotions
Auto-Discount Configuration¶
Merchello can validate and surface Google auto-discount tokens. Configure the public key URL in appsettings.json:
{
"Merchello": {
"ProductFeeds": {
"GoogleAutoDiscountPublicKeyUrl": "https://www.gstatic.com/shopping/merchant/auto_discount/signing_key.json"
}
}
}
Automatic Refresh¶
Feeds are cached in the database so serving them is a fast read, not a full product query. A background job (ProductFeedRefreshJob) periodically rebuilds all enabled feeds.
Configure the refresh schedule in appsettings.json (binds to ProductFeedSettings):
You can also trigger a manual rebuild from the backoffice or via POST /api/v1/product-feeds/{id}/rebuild (see ProductFeedsApiController).
Custom Field Resolvers¶
Product feed field values are resolved through a pluggable resolver system. Built-in resolvers handle standard Google Shopping fields (title, description, price, availability, etc.), but you can register custom resolvers for specialized needs.
Each resolver receives a ProductFeedResolverContext with the product data, feed configuration, and store settings, and returns the resolved field value. Resolvers are discovered via ExtensionManager.
For the full developer guide (registering resolvers, field aliases, testing) see docs/Product-Feed-Resolvers.md.
Multiple Feeds¶
You can create multiple feeds targeting different countries, currencies, or product subsets. For example:
us-shopping-- US products in USDgb-shopping-- UK products in GBP with tax includedde-shopping-- German products in EUR
Each feed has its own public URL to submit to Google Merchant Center.
Backoffice API¶
Source: ProductFeedsApiController.cs.
| Endpoint | Method | Description |
|---|---|---|
/api/v1/product-feeds |
GET | List feeds |
/api/v1/product-feeds/{id} |
GET | Feed detail |
/api/v1/product-feeds |
POST | Create feed |
/api/v1/product-feeds/{id} |
PUT | Update feed |
/api/v1/product-feeds/{id} |
DELETE | Delete feed |
/api/v1/product-feeds/{id}/rebuild |
POST | Force immediate rebuild |
/api/v1/product-feeds/{id}/preview |
GET | Preview generated items |
/api/v1/product-feeds/{id}/validate |
POST | Validate feed output against Google rules |
/api/v1/product-feeds/resolvers |
GET | List registered resolvers (for custom fields) |