Magento Product Feed: The Complete 2026 Guide to Google Shopping and Merchant Center

Ishant

Ishant

Published : September 30, 2026 at 9:30 am

Updated : September 29, 2026 at 5:32 pm

Magento product feed illustration with a storefront, product catalog and product data checks for Google Shopping.

Written by Ishant Sharma, Google Ads, Microsoft Ads and SEO specialist since 2013 | Updated September 2026 | Facts checked September 18, 2026

If your Magento product feed stopped updating in Google Merchant Center some time in the last month, you are not imagining it and your extension is probably not broken in the way you think.

Google’s Content API for Shopping was sunset on 18 August 2026, and from 1 September 2026 Google began returning progressive errors to anything still calling it. Every Magento extension that pushes product data straight into Merchant Center over the old Content API v2.1 is now either failing outright or quietly degrading. The symptom most merchants notice first is not an error message. It is a “last updated” date in Merchant Center that has stopped moving.

We manage Merchant Center and product feeds for ecommerce clients, including the Magento store we grew to $14.3M in lifetime sales through SEO. This guide covers the migration check you need to run this week, and then the full technical picture of getting product data out of Magento and into Google, including the parts that every other guide skips.

Table of Contents

  1. Why Did My Magento Google Shopping Feed Stop Working in September 2026?
  2. Does Magento Have a Native Google Shopping Feed?
  3. Is Adobe Commerce “Product Feed” the Same as a Google Shopping Feed?
  4. How Do Magento Attributes Map to Google Shopping Attributes?
  5. Which Magento Products Should Actually Go in the Feed?
  6. Why Does My Magento Feed Generate But Never Update?
  7. How Do I Set Up Feeds for Multiple Stores and Currencies?
  8. Which Magento Product Feed Extension Should I Use?
  9. How Do I Handle Very Large Magento Catalogs?
  10. What Are the Most Common Magento Feed Disapprovals?
  11. How Does the Magento Feed Fit With Performance Max?
  12. Magento Product Feed FAQs

Why Did My Magento Google Shopping Feed Stop Working in September 2026?

Because Google turned off the API your extension was probably using.

The timeline matters here, so here it is precisely:

DateWhat happened
18 August 2025Content API for Shopping deprecated
18 August 2026Content API for Shopping sunset
1 September 2026Google begins returning progressive errors to remaining callers

The replacement is the Merchant API. It is not a drop-in swap. It uses different client libraries, a different resource model and different authentication scopes, which is why extension vendors had to ship real code changes rather than a config update.

What makes this painful for Magento specifically is that the failure is often silent. If your extension writes a file and Google fetches it on a schedule, nothing changed and you are fine. If your extension pushes to Merchant Center over the API, the push can fail while your Magento admin still shows the feed generating successfully, because the generation step and the transmission step are separate. Your feed file is perfect. It just never arrives.

For the wider picture of what this shutdown affects beyond Magento, see our Content API shutdown checklist.

How Do I Check Whether My Magento Extension Is Affected?

You can answer this in about sixty seconds without opening the admin. Look in your project’s `composer.lock` or `composer.json` for the Google client libraries your feed extension depends on.

If you find these, you are on the legacy Content API and you need to migrate:

google/apiclient
google/apiclient-services

Note that `google/apiclient` alone proves nothing, because it is the generic Google API client used for dozens of unrelated services. The reliable tell is in code, where the Content API service class appears as:

Google_Service_ShoppingContent

or in its namespaced form:

Google\Service\ShoppingContent

If you find these, you are on the Merchant API and you are fine:

google/shopping-merchant-products
google/shopping-merchant-datasources
google/shopping-merchant-accounts

From the command line:

grep -rE "google/(apiclient|shopping-)|ShoppingContent" composer.lock app/code vendor/*/module-*

As of September 2026, Mirasvit has migrated and now requires `google/shopping-merchant-datasources` v1.2 or higher with PHP 8.1+. Note that the current 1.3.x releases of that Google package require PHP 8.2, so PHP 8.1 only works if you pin to the 1.2.x line. Webkul installs `google/shopping-merchant-products`. Several other vendors have not publicly stated their migration status, which is itself useful information: if your vendor has not said anything about the Merchant API, assume you need to ask them directly before your next billing cycle.

Should I Use API Push or Scheduled Fetch for Magento?

This is where we take a position that differs from most extension vendors, who naturally prefer to sell you the API integration.

For Magento specifically, publishing a static XML or TXT file and letting Google fetch it on a schedule is more upgrade proof than pushing over the API. The file format Google accepts has been stable for years. Google’s APIs have now churned twice in the lifetime of Magento, killing Magento 1’s native module the first time and breaking a large share of Magento 2 extensions the second time.

Scheduled fetch gives up some things. You lose near real time price and stock updates, and you lose the granular per item error reporting the API returns. For most catalogs those are acceptable trades, and you can close the freshness gap with a supplemental feed for price and availability, which we cover in our guide to supplemental feeds in Google Shopping.

Use API push when you genuinely need sub hourly updates: flash sales, heavily discounted stock, or catalogs where items sell out in minutes. Otherwise a well built file on a scheduled fetch will cause you fewer 3am problems.

Does Magento Have a Native Google Shopping Feed?

No, not today, and not since April 2020. Every competing guide states this as a throwaway line before selling you an extension. None of them tell you what actually existed or when it went away, so here is the real history with dates, because it explains why the extension market looks the way it does.

To be precise about it, because the distinction matters: Magento 2 core has never shipped a standalone feed file generator that writes Shopping XML or CSV. What it did briefly ship was a channel connector that pushed products to Merchant Center over Google’s API, and that was deprecated and removed in 2020. Since then there has been nothing in core for Google Shopping at all.

Magento 1 Had a Native Module, and Google Killed It

Magento 1 shipped `Mage_GoogleShopping`, a genuine core module that synced products to Google using Content API v1. When Google retired v1, the module broke. The community fork `bluevisiontec/GoogleShoppingApi` picked it up and added v2 and OAuth2 support.

If you are still on Magento 1 or OpenMage LTS, you are in a small group that no editorial content serves. XTENTO still ships a separate Magento 1 extension covering 1.4.1.0 through 1.9.4.5 plus OpenMage, and Apptrian also maintains an M1 build. Note that these are separate licences from the Magento 2 versions, because they are genuinely different codebases.

Magento 2 Never Shipped a Feed File Generator

What Magento 2 briefly had was different, and it was a connector rather than a file generator: a “Google Shopping ads Channel” extension, announced by Adobe on 13 May 2019 and managed from the Advertising Channels section of the admin. It was deprecated in core in 2.3.5 and 2.3.4-p1, and removed from Magento Marketplace on 28 April 2020. Adobe’s documentation for it now sits under a discontinued path, and Adobe’s own knowledge base states it will not be supported nor function.

So the honest answer to “does Adobe Commerce connect to Merchant Center out of the box” is: there has been no native path since April 2020, and the thing that existed before that pushed products over Google’s API rather than generating a feed file you control. Worth noting that 28 April 2020 is also the Magento 2.3.5 GA date, so the removal and the deprecation landed together.

This matters practically because it means every solution you evaluate is third party, and the quality range is enormous.

Is Adobe Commerce “Product Feed” the Same as a Google Shopping Feed?

No, and this trips up a lot of people searching for help.

Adobe Commerce does have a feature called product feeds, delivered by the `magento/saas-export` module and the SaaS Data Export framework. It has nothing to do with Google Merchant Center. It exists to feed Adobe’s own services: Live Search, Catalog Service, Product Recommendations and Adobe Commerce Optimizer.

You can recognise it by its CLI:

bin/magento saas:resync --feed products
bin/magento saas:resync --feed prices --cleanup-feed
bin/magento saas:resync --feed variants --dry-run

Its feed names include `products`, `prices`, `variants`, `productAttributes`, `categories`, `scopesWebsite`, `scopesCustomerGroup`, `inventoryStockStatus` and `orders`. Its logs are:

var/log/commerce-data-export.log
var/log/data-export-errors.log
var/log/saas-export.log
var/log/saas-export-errors.log

Errors split by phase, so collection problems land in `commerce-data-export-errors.log` while transmission problems land in `saas-export-errors.log`. For debugging there are environment variables: `EXPORTER_EXTENDED_LOG=1` writes the payload to the log, `PERSIST_EXPORTED_FEED=1` retains the payload in the index table on 103.3.0 and later, and `EXPORTER_PROFILER=1` outputs performance data when a resync is slow.

Can I Build a Merchant Center Feed on Top of SaaS Data Export?

You can, and for large Adobe Commerce catalogs it is worth considering, because the data is already denormalised and indexed. That avoids the expensive EAV collection queries most extensions run.

The honest limits: the schema is designed for Adobe’s services rather than Google’s, so you will be mapping and supplementing rather than reading fields straight across. Shipping and tax have no natural home. You extend the schema through `etc/et_schema.xml` and providers implementing `DataProcessorInterface`. It is an architect’s solution, not a store manager’s, and if nobody on your team writes Magento modules it is the wrong path.

How Do Magento Attributes Map to Google Shopping Attributes?

Magento feed data checks for product IDs, prices, availability and variants.

This is table stakes and every guide has a version of it. Here is ours, with the Magento source, the Google target and the gotcha that actually causes disapprovals.

Google attributeMagento sourceWhat goes wrong
`id``sku` or `entity_id`Must be stable forever. If you regenerate SKUs on import you lose all item history and performance data
`title``name`150 character limit, roughly 70 display. Variant titles that all read identically trigger generic title warnings
`description``description`, `short_description` or `meta_description`Strip HTML. 500 to 1,000 characters performs best. Raw Magento WYSIWYG output often carries markup that Google rejects
`link``product_url`See the configurable URL trap below. This is the single biggest Magento specific disapproval cause
`image_link``image_url`Must be the full size image, not a cached resize. Placeholder images cause disapprovals
`additional_image_link`media galleryUp to 10, excluding the main image
`availability``is_in_stock`, `quantity`With MSI, stock is per source and per stock, not a single global value. Extensions that read the legacy table report wrong availability on multi source setups
`price``price`Must include currency and match the landing page exactly
`sale_price``special_price`Only populate when actually on sale. A permanent sale price is a policy problem
`sale_price_effective_date``special_from_date`, `special_to_date`Format as an ISO 8601 range. A missing end date means the sale never ends
`brand``manufacturer`Frequently empty in Magento because it is an optional default attribute. This is the most common missing required field
`gtin`custom attributeNot a default Magento attribute. You have to create it
`mpn`custom attribute or `sku`Only valid as a fallback when a real GTIN does not exist
`identifier_exists`staticSet to `no` for custom made or vintage items with no GTIN. Do not set it to `no` just to silence warnings on branded goods
`condition`static or custom attribute`new`, `refurbished` or `used`
`google_product_category`category mappingMap once at category level, override at product level for exceptions
`product_type``category_path`Your own taxonomy. Useful for campaign structure and custom labels
`item_group_id``parent_id`Required to group variants. Get this wrong and variants compete with each other
`shipping_weight``weight`Include the unit
`custom_label_0` to `custom_label_4`any attribute or ruleWhere margin tiering lives, covered in our guide to custom labels and margin tiers

One correction worth making, because a lot of agency material still repeats it: there is no longer a “submit at least two of GTIN, brand and MPN” rule. That was Google’s requirement before 2016. The current rule is simpler and stricter. If a product has a GTIN assigned by its manufacturer, submit the GTIN, the brand and the MPN. If no GTIN exists, for example on custom made or handmade goods, submit brand and MPN instead. Google also warns explicitly against guessing or borrowing values from similar products, and states that products which have an assigned GTIN but are submitted without one may get limited visibility.

GTIN is the identifier Magento does not give you, so see our GTIN guide for Google Shopping and our check digit calculator if you are validating barcodes in bulk.

If you want to map your own attribute set against Google’s specification before building anything, our feed attribute mapper does that step.

How Do I Add a GTIN Attribute in Magento 2?

Create it as a product attribute, then add it to the attribute sets that need it.

Go to Stores, then Attributes, then Product, then Add New Attribute. Set the default label to GTIN, the catalog input type to Text Field, and under Advanced Attribute Properties set the attribute code to `gtin` and the scope to Global. Under Storefront Properties you can leave it hidden. Then go to Stores, Attribute Set, and drag the new attribute into the relevant sets.

Set scope to Global rather than Store View. A GTIN identifies a physical product and does not change between store views, and a store view scoped attribute creates rows you will later have to keep in sync for no reason.

Which Magento Products Should Actually Go in the Feed?

This is the question that separates a feed that works from one that produces disapprovals for months, and it is where Magento’s product types cause more trouble than any other platform.

The governing principle is simple: only export products a customer can actually buy.

Product typeWhat to exportWhy
Simple, visibleThe productStraightforward
Simple, not visible individually (a variant)The child, with `item_group_id`This is what the customer buys
ConfigurableThe children, not the parentA configurable parent cannot be added to cart directly
GroupedThe parentThe group is the purchasable unit
BundleThe parentPricing applies to the bundle, not the components
Virtual and downloadableUsually excludeMost are not eligible for Shopping
Disabled or out of stockExclude, or mark availability correctlyDo not silently drop items you want to keep indexed

Which Values Can Variants Inherit From the Parent?

This distinction causes the generic title problem that Merchant Center flags.

Safe to inherit from the parent: name, description, brand, condition, and usually category and image when the child has none.

Must stay unique per variant: GTIN, MPN, colour, size, and any other attribute that defines the variant.

If you inherit colour and size from the parent you produce a set of items that are identical apart from their IDs, which is exactly what the generic title warning is telling you about.

Most extensions expose this as parent fallback settings. The pattern that works is: use the parent value only when the child value is empty, and apply that fallback only to simples that are not visible individually. Applying it to standalone simple products overwrites legitimate data.

The Configurable Product URL Trap Nobody Writes About

Here is the most useful thing in this article, and as far as we can tell no other guide connects these two facts.

Every extension recommends exporting variant URLs with an auto-link fragment so the shopper lands on the product page with the right variant preselected. The URL looks like this:

https://example.com/product.html#100=1

That is sensible advice for user experience. It is also a disapproval vector on Magento.

Magento issue #38110 documents that hash based configurable URLs update the displayed price client side through JavaScript. Google Merchant Center reads the server rendered HTML source. So when a configurable product has different prices per combination, for example red at $30 and blue at $40, the server rendered page shows the parent’s default price while your feed carries the variant price. Merchant Center sees a mismatch between the feed price and the landing page price, and disapproves the item.

The issue was reported against 2.4.6-p2 at severity S0 and closed as needing update, with no patch and no documented workaround.

Your realistic options:

  1. Point `link` at the parent URL without the fragment and make sure the parent page renders a price that matches, or renders a range that contains the feed price. Simplest, and loses the preselection.
  2. Use server side variant parameters instead of a fragment, so the page renders the correct price in source HTML. Requires development work and usually a controller change.
  3. Keep the fragment and accept periodic price mismatch disapprovals on multi price configurables, monitoring them in Merchant Center.

Option one is what we implement on client accounts unless there is a strong reason not to. A preselected swatch is worth less than an approved item.

What Happens When One Simple Belongs to Two Configurables?

Magento allows a simple product to be linked to more than one configurable parent through `catalog_product_super_link`. Your feed then has to decide which `item_group_id` wins, and most extensions make that choice for you without telling you.

This is a real and current bug class rather than a theoretical one. Mageplaza’s release notes record a v4.7.6 fix for exactly this scenario. If your catalog shares simples across configurables, export a test feed and check those SKUs specifically, because a wrong `item_group_id` silently merges unrelated variant groups.

Why Does My Magento Feed Generate But Never Update?

Cron. Almost always cron. Every other guide says “make sure cron is enabled” and stops there, which is not useful when cron is enabled and the feed is still stale. Here are the actual failure modes.

The Missed Cron Trap

Feed extensions usually register their own cron group rather than using the default. That group has its own “Missed if Not Run Within” setting, found under Stores, Configuration, System, Cron, in the section for that group.

If your system crontab fires less often than that window, the job is marked `missed` in the `cron_schedule` table and never runs. Worked example: a crontab firing at minutes 1, 30 and 59 leaves a 29 minute gap, so a group with a 2 minute missed window is permanently missed. The feed never regenerates and nothing in the admin looks broken.

Check it directly:

SELECT job_code, status, COUNT(*)
FROM cron_schedule
WHERE scheduled_at > NOW() - INTERVAL 1 DAY
GROUP BY job_code, status;

If your feed job shows a stack of `missed` rows, that is your answer. Fix it by raising the missed window, adjusting the schedule in the module’s `etc/crontab.xml`, or tightening the system crontab so it runs every minute as Magento expects.

The 2.3.5 Cron Locking Change

This one explains the complaint that a feed is “randomly corrupt about once a week”, and we have not seen it written about in a feed context anywhere.

Magento 2.3.5 introduced a backward incompatible change to cron locking. Commit `ce5b6f6` under MC-22819, aimed at fixing deadlocks related to crons and consumers, moved `processPendingJobs()` in `Magento\Cron\Observer\ProcessCronQueueObserver` outside the group level lock, leaving only job level locking. Magento issue #29924 records the consequence in the reporter’s words: cron jobs from the same group could not previously run simultaneously, and now they can.

For feeds this is significant. A long running generation job that used to be serialised by its group can now overlap with another instance of itself. Two processes writing the same XML path produce truncated, interleaved or zero byte files, and Merchant Center reports parse errors that you cannot reproduce on demand because the next run completes cleanly.

Mitigations: give the feed job a generous missed window so a slow run is not re-queued on top of itself, run generation through the CLI on a system cron rather than Magento cron for large catalogs, or add your own lock file around generation.

Adobe Commerce Cloud Cron Starvation

Adobe documents that only one cron job can run at a time on the web instance of a Cloud project, because of the read only nature of those environments. On older Pro projects in particular, where crons are not self managed, a twenty minute feed job therefore blocks every other cron group on the instance. The symptoms are unprocessed product updates and missed transactional emails.

The fix is to request self managed crons from Adobe support and then declare them in `.magento.app.yaml`:

crons:
  cronrun:
    spec: "* * * * *"
    cmd: "php bin/magento cron:run"

Verify with `crontab -l` after deployment. Also look at `use_separate_process` per group, which stops one heavy group blocking the rest.

Indexers and Stale Feed Data

Most feed extensions read indexed price and stock tables rather than recalculating values, which is the right decision for performance and the wrong one when your indexers are behind.

If `catalog_product_price` or `inventory` is invalid or stuck in “Update by Schedule” with a backlog, your feed exports yesterday’s prices perfectly happily. Check with:

bin/magento indexer:status

Any indexer showing invalid or reindex required while your feed job runs means the feed is publishing stale data. On large catalogs, sequence the feed generation to run after reindexing rather than in parallel with it.

Feed generation speed is also a symptom of the same underlying issues that slow the storefront. Our guide to Magento speed optimization covers the indexer and caching side in more depth.

How Do I Set Up Feeds for Multiple Stores and Currencies?

One feed per store view. Not per website, per store view, because store view is where language and currency resolve.

The practical rules:

  1. Generate a separate file per store view with a distinct filename, for example `google_us.xml`, `google_uk.xml`, `google_de.xml`. Shared filenames across store views is a common and confusing failure.
  2. Create a separate Merchant Center feed for each target country and language, and match the feed’s country and language to the store view’s.
  3. Make sure product URLs in each feed use that store view’s base URL, including the store code if you use them in URLs.
  4. Currency must be the store view’s display currency, and prices must match what a shopper in that country sees, including tax treatment for that market.
  5. Where you have market specific stock, availability has to resolve per source rather than globally.

For the Merchant Center side of multi currency setup, including when you need separate feeds versus currency overrides, see our guide to multi-currency feed setup, which covers the Merchant Center rules that apply regardless of platform.

Which Magento Product Feed Extension Should I Use?

Prices below are as published in September 2026. Check current pricing before you buy, and check Merchant API status before you renew.

ExtensionPriceBest forWatch out for
WeltPixelFreeTrying the approach before payingFewest features, no CLI
Apptrian$39.99 CEMulti channel on a budget, M1 build availableLess depth on configurables
Magmodules$99, or EUR 99 directGoogle specifically. Best configurable docs in the marketGoogle only
Magefan$99 one timePer SKU exclusion diagnosticsGoogle Shopping focused
Plumrocket$99Straightforward setupsThin on product type handling
Wyomindfrom €145Technical teams. Strongest templating and performance controlsSteep learning curve
Mageplaza$179 CE / $379 EEMany output formats and delivery methodsRelease notes show variant bugs still being fixed in 2026
XTENTO$169 one timeMagento 1 and OpenMage, XSL templatingNot suitable for non technical users
Amasty$249 per yearPerformance knobs, multi process generationSubscription, and GTIN is not addressed in their materials
Mirasvit$179 CE / $290 EE / $580 ECELargest template library, CLI, confirmed Merchant API migrationHighest price at the top tiers

Three things to weigh that the comparison listicles do not mention:

Merchant API status is now the most important column. An extension that has not migrated is a liability regardless of features.

One time versus subscription matters more on Magento than elsewhere, because Magento upgrades break extensions and a one time licence often means paying again for compatibility with the next minor version.

Middleware such as Feedonomics, DataFeedWatch, Channable and GoDataFeed is a different category. It moves the mapping logic out of Magento entirely, which insulates you from Magento upgrades and gives you many channels at once, at a much higher monthly cost. It makes sense above roughly 20,000 SKUs or when you are selling on more than three or four channels.

How Do I Handle Very Large Magento Catalogs?

Above roughly 50,000 SKUs, feed generation stops being a configuration task and becomes an engineering one.

Generate from the CLI rather than through Magento cron, so you control memory and timeout directly. Most serious extensions provide a command, for example:

bin/magento wyomind:simplegoogleshopping:generate
bin/magento xtento:productexport:export

Raise the memory limit for that command specifically rather than globally. 1024M is a common working figure for six figure catalogs.

Tune batch size if your extension exposes it. Wyomind exposes items in buffer and items per SQL request, defaulting to 10 and 1500. Amasty exposes products per iteration plus multi process generation. Smaller batches use less memory and take longer, and the right number depends on your row size rather than your SKU count.

Write to a temporary file and rename on completion, so Google never fetches a half written file. Some extensions do this, many do not, and it is worth confirming.

Split by store view or by category rather than generating one enormous file, then submit multiple feeds to Merchant Center.

Run generation outside peak traffic, because a feed job reading the full catalog competes with the storefront for database connections.

What Are the Most Common Magento Feed Disapprovals?

DisapprovalMagento specific causeFix
Price mismatchConfigurable hash URL rendering the parent price server sideLink to parent URL, or render variant price server side. See the trap section above
Missing brand`manufacturer` empty because it is optional in MagentoPopulate the attribute, or map a fallback
Missing GTINNo native GTIN attribute existsCreate the attribute, or set `identifier_exists` correctly
Generic titles for variantsVariants inheriting colour and size from the parentInherit only name, description, brand and condition
Image not foundFeed carrying a cached resize URL or placeholderExport the base image URL
Availability mismatchExtension reading legacy stock tables on an MSI setupUse a source and stock aware extension
Duplicate itemsSame simple exported under two configurable parentsDecide the `item_group_id` rule explicitly
Stale dataMissed cron, invalid indexers, or an overlapping jobWork through the cron section above
Landing page unreachableStore view base URL mismatch in a multi store feedOne feed per store view with the correct base URL

If an account level suspension has already happened rather than item level disapprovals, our guides to Merchant Center suspensions and misrepresentation appeals cover the reinstatement process.

How Does the Magento Feed Fit With Performance Max?

Feed quality determines Performance Max outcomes more than any other input, because the feed is most of what you still control in a campaign type that hides so much.

The specific Magento implication is that your custom labels have to be generated from data Magento actually holds. Margin is the usual example and it is rarely a Magento attribute, so you either create one and maintain it, or compute margin tiers in middleware. Doing it by rule inside the extension is possible but brittle, because the rule has no access to cost data unless you have populated `cost` on the product.

Our guide to Performance Max and feed optimization covers the campaign side, and product feed optimization covers the attribute level work that applies across platforms.

Magento Product Feed FAQs

Does Magento 2 have a built in Google Shopping feed?

No, and it has nothing for Google Shopping in core today. Magento 2 has never shipped a standalone feed file generator that writes Shopping XML or CSV. What it did briefly include was a Google Shopping ads Channel extension, announced May 2019, which pushed products to Merchant Center over Google’s API rather than generating a file. That was deprecated in 2.3.5 and 2.3.4-p1 and removed from Magento Marketplace on 28 April 2020. Since then every route from Magento to Merchant Center requires a third party extension or external feed middleware.

Why did my Magento feed stop uploading to Merchant Center in September 2026?

Most likely because your extension still uses Google’s Content API for Shopping, which was sunset on 18 August 2026 with progressive errors beginning 1 September 2026. Check your code for the `Google_Service_ShoppingContent` class, or its namespaced form, which is the reliable indicator of the legacy API, and check `composer.lock` for `google/shopping-merchant-products` or `google/shopping-merchant-datasources`, which indicate the current Merchant API. Note that `google/apiclient` on its own proves nothing, since it is the generic Google client used for many services. Extensions on the legacy libraries need updating or replacing.

Should I export configurable parents or their child products?

Export the children, not the parent, because a configurable parent cannot be added to cart directly. Give every child the same `item_group_id` so Google groups them as variants. Children should inherit name, description, brand and condition from the parent, but must keep their own GTIN, MPN, colour and size. Bundle and grouped products are the opposite case: export the parent, because that is the purchasable unit.

Why does Google say my Magento price does not match my landing page?

On configurable products this is usually caused by variant URLs using a hash fragment, such as `product.html#100=1`. Magento updates the displayed price client side with JavaScript, while Merchant Center reads the server rendered HTML, so Google sees the parent’s default price rather than the variant price. This is documented in Magento issue 38110 and has no official patch. The practical fix is to point the feed’s `link` attribute at the parent URL and ensure the parent page renders a matching price.

How do I add GTIN to Magento 2 products?

GTIN is not a default Magento attribute, so create it under Stores, Attributes, Product, Add New Attribute. Use a Text Field input type, set the attribute code to `gtin`, and set the scope to Global rather than Store View, since a barcode does not change between store views. Then add the attribute to the relevant attribute sets. If genuine GTINs do not exist for your products, for example custom made or vintage items, set `identifier_exists` to no rather than inventing values.

Why does my Magento feed generate successfully but show old data?

Two usual causes. First, cron: feed extensions register their own cron group with a Missed if Not Run Within setting, and if your system crontab interval exceeds that window the job is silently marked missed and never runs. Check the `cron_schedule` table for missed rows. Second, indexers: most extensions read indexed price and stock tables, so if `catalog_product_price` or inventory indexers are invalid or backlogged, the feed faithfully exports stale values. Run `bin/magento indexer:status` to confirm.

Do I need a separate feed for each Magento store view?

Yes. Store view is where language and currency resolve, so generate one file per store view with a distinct filename, and create a matching Merchant Center feed for each country and language combination. Make sure each feed uses that store view’s base URL for product links and its display currency for prices. Sharing one filename across store views is a common cause of feeds overwriting each other.

Is it better to use a Magento extension or feed management software?

Extensions are more cost effective below roughly 20,000 SKUs and when Google is your main channel, with one time licences from around $40 to $290. Feed management software such as Feedonomics, DataFeedWatch or Channable costs considerably more per month but moves the mapping logic outside Magento, which protects you from Magento upgrades breaking the integration and supports many channels from one setup. The tipping point is usually catalog size, channel count, or having been burned by an upgrade.

Can I still get a product feed from Magento 1?

Yes, though the options are limited. Magento 1’s native `Mage_GoogleShopping` module broke when Google retired Content API v1, and the community fork `bluevisiontec/GoogleShoppingApi` added v2 support. For current setups, XTENTO maintains a Magento 1 extension covering versions 1.4.1.0 to 1.9.4.5 plus OpenMage LTS, and Apptrian also ships an M1 build. These are separate licences from the Magento 2 versions because the codebases differ.

What is Adobe Commerce SaaS Data Export and is it a Shopping feed?

It is not a Shopping feed. SaaS Data Export, delivered by `magento/saas-export`, publishes product data to Adobe’s own services: Live Search, Catalog Service, Product Recommendations and Adobe Commerce Optimizer. You can identify it by CLI commands like `bin/magento saas:resync –feed=products`. It is possible to build a Merchant Center feed on top of it for large catalogs, since the data is already denormalised and indexed, but the schema targets Adobe’s services rather than Google’s, so it requires development work.

Need a Magento feed built or rescued? We manage Merchant Center and product feeds for ecommerce clients, including the Magento store we grew to $14.3M in lifetime sales. See our Magento SEO services and Magento PPC management, or read our wider Magento SEO guide.

About the author: Ishant Sharma has worked in digital marketing since 2013 as a Google Ads, Microsoft Ads and SEO specialist, across ecommerce, local service, SaaS and white label agency accounts in the US, UK, UAE and Australia. His platform work spans Magento SEO and Magento PPC. He leads ecommerce PPC management and Google Ads at Hustle Marketers. He is the founder of Hustle Marketers, a best digital marketing agency for ecommerce and local service brands, a Google Partner and Meta Business Partner agency. Trackable client sales across his work have passed $780M, and he is Top Rated Plus on Upwork. More about Ishant.

Ishant

Ishant Sharma is the Founder and CEO of Hustle Marketers, a Google Partner digital marketing agency. With 12+ years of experience in Google Ads, Meta Ads, SEO, and e-commerce PPC, he has helped 2,500+ brands generate $780M+ in trackable sales. Upwork Top Rated Plus with 100% Job Success Score. Ishant Sharma is the digital marketing specialist, not the Indian cricketer of the same name.

I hope you enjoy reading this blog post. If you want my team to just do your marketing for you, click here.
Scroll to Top