Integration
Magento + Google Shopping
Magento 2 exports its catalog as CSV from System → Data Transfer → Export, and a free module can write a Google XML feed on a cron. Neither gives you rule-based titles, filters or a profiled output. This page shows how to get a Magento Google Shopping feed from either export into Merchant Center with the mapping done once, in one place.
We connect your store, build the feed and keep it in sync. Updated 2026-10-27.
At a glance
- Magento's native export (System → Data Transfer → Export, entity Products) writes a CSV to var/export/ in the background; it is a one-off file, not a URL.
- WeltPixel Product Feed is free and open source, generates Google-only XML feeds on a cron and gives a direct URL; compatible with Magento 2.3.x–2.4.x.
- Textfinity reads that XML or CSV URL on a schedule, maps attribute codes like sku, name, special_price and url_key to Google attributes, and publishes the feed Merchant Center fetches.
- No Magento extension to install for Textfinity; the connection is the export URL, the same as for WooCommerce and PrestaShop.
Two Magento exports that can feed Google Shopping
The native route is System → Data Transfer → Export. Pick the Products entity, filter by attribute value if you want a subset, exclude attributes you do not need, and start the export. It runs through the message queue, so cron must be running, and the CSV lands in var/export/ (or the remote storage export folder). Columns are the attribute codes: sku, name, description, price, special_price, qty, image, url_key, categories and whatever custom attributes the store defines. Because it is a file on the server rather than a URL you schedule, it works for a one-time load into Textfinity or for a store that exposes var/export/ behind a protected URL on its own cron.
The URL route is a free feed module. WeltPixel Product Feed is free and open source, generates XML feeds for Google (it is Google-only for now), can run on a scheduled cron job and shows a direct URL for each feed, with files stored in pub/media/weltpixel-feeds. Let it emit the raw attributes and do the mapping in Textfinity so there is one set of rules to maintain.
Magento attribute codes to Google Shopping attributes
| Magento attribute | Google attribute | Rule in Textfinity |
|---|---|---|
| sku | id | Rename (max 50 chars) |
| name (+ color, size for configurables) | title | Combine manufacturer, name, color, size with ", "; max 150 chars |
| description or short_description | description | Remove from regexp <[^>]+> to drop the page-builder HTML |
| url_key | link | Advanced: "https://store.example/" + [url_key] + ".html" |
| image (or base_image) | image_link | Add prefix https://store.example/media/catalog/product |
| qty + is_in_stock | availability | Advanced: if [is_in_stock] equals "1" then "in_stock" else "out_of_stock" |
| price | price | Add suffix " USD" |
| special_price | sale_price | Add suffix; leave empty when blank |
| manufacturer or brand | brand | Rename; max 70 chars |
| gtin / ean / upc (custom attribute) | gtin | Rename; empty stays empty |
| categories (last path) | google_product_category | Replace from Google Sheet (substring find-and-replace: keep column A paths specific) |
| configurable parent sku | item_group_id | Rename on child rows; simple products use their own sku |
| visibility, product_online | (filter) | Filters: product_online is equal to 1; visibility is not equal to Not Visible Individually |
Google attributes and limits from Google's product data specification, checked 2026-10-27. Magento columns are the attribute codes in the Products export; your store's set depends on its attribute sets, and the mapping uses the real headers in your file.
What has to be fixed between Magento and Merchant Center
- Image paths: Magento exports a relative path such as /m/u/mug-blue.jpg. Google needs an absolute URL; an add prefix rule with your media base URL fixes every row.
- Product URLs: url_key is a slug, not a link. Add prefix with the store URL, or, if the store uses the .html suffix, one advanced expression that adds both, since a column takes one rule.
- Configurable products: the parent has no price or stock of its own, the children have no images. Filter the parent out, map the children, and set item_group_id from the parent sku so Google groups them.
- Page-builder HTML: descriptions carry div and style tags. One remove from regexp rule returns plain text.
- Stock: Magento gives qty and is_in_stock. Google wants in_stock, out_of_stock, preorder or backorder. Map from is_in_stock, not from qty, so backorderable products stay listed.
- Multi-store views: if the export includes store_view_code rows, filter one view per feed. One feed per store view and currency is the clean pattern.
How Merchant Center picks the feed up
Merchant Center adds a product source from a file in its data sources settings. Give it a URL that begins with http, https, ftp or sftp and points at the file itself, choose a fetch schedule, and add a login if the file is protected. Files may be up to 4 GB. Scheduling happens in Google's interface.
Textfinity gives every feed a stable URL and rebuilds it on the shop's sync schedule, with dirty feeds rebuilt within about five minutes of a rule change. We register that URL in your Merchant Center with you, through access you give us or on a short call. Keep the Magento cron (the module's feed generation) running at least as often as the Textfinity sync.
Examples
Worked examples, by situation
Three Magento catalogs and the rule that got each one approved.
Absolute image and product links from relative paths
Before
image: /o/a/oak-table-180.jpg url_key: oak-dining-table-180
After
image_link: https://store.example/media/catalog/product/o/a/oak-table-180.jpg link: https://store.example/oak-dining-table-180.html
How we set it up
We map image_link with add prefix https://store.example/media/catalog/product and link as an advanced expression: "https://store.example/" + [url_key] + ".html". The URL validation checker in feed hygiene confirms every row resolves to a file.
Children carry the group id, parents stay out
Filters and mapping
exclude if [product_type] is equal to "configurable"
item_group_id <- rename from [parent_sku]
title <- [manufacturer] + " " + [name] + ", " + [color] + ", EU " + [size]How we set it up
We exclude rows where product_type is equal to configurable, map item_group_id as a rename of the parent sku column the export provides, and build title as an advanced expression as shown. Google then shows one listing with size and color pickers.
Stock words and currency for a DE feed
Before
is_in_stock: 1 qty: 0 price: 249.0000 special_price: 199.0000
After
availability: backorder price: 249.00 EUR sale_price: 199.00 EUR
How we set it up
We map availability as an advanced expression: if [is_in_stock] equals "1" AND calc{[qty]} == 0 then "backorder" else if [is_in_stock] equals "1" then "in_stock" else "out_of_stock". Price is another: round(calc{[price]}, 2) + " EUR". Same for special_price into sale_price, with the condition special_price matches regexp ^\s*$ leaving sale_price empty.
Copy this plan
Plan: Magento 2 to Merchant Center
One Magento admin step, four feed steps that we set up in Textfinity for you, one Merchant Center step.
01
Publish a feed URL from Magento
Install a free feed module (WeltPixel Product Feed is free and open source), create one feed with every attribute you might map, schedule its cron and copy the direct URL. Or protect var/export/ behind a URL on your own cron if you prefer the native CSV. This happens in the Magento admin.
02
Add the URL as a shop
The feed tool pulls the file, detects columns and profiles them: completeness per attribute, title lengths, image URLs that are relative, inconsistent stock values.
What we set up: We add the module's XML URL or the protected CSV URL as the source and send you the profile.03
Create the Google Shopping feed
The template pre-fills Google's attribute names; map each from the table above.
What we set up: We start the feed from the Google Shopping channel template and map it from the table above.04
Add the Magento-specific rules
Prefix media and product URLs, strip HTML, translate is_in_stock, add the currency, set item_group_id for children.
What we set up: We map image_link with add prefix, link and availability as advanced expressions, description with remove from regexp and price with add suffix.05
Filter parents, disabled and invisible products
Configurable parents, product_online = 0 and Not Visible Individually items should not reach Google.
What we set up: We add filters: exclude product_type is equal to configurable; include product_online is equal to 1 and visibility is not equal to Not Visible Individually.06
Hand the feed to Merchant Center
Add the feed URL in Merchant Center as a product source from a file and set a daily fetch. This step is in Google's interface.
What we set up: We register the feed URL with a daily fetch in your Merchant Center, with access you give us or on a short call.
Customization tips
Make it yours
Export short_description for ads, description for free listings? Pick one
Google uses one description attribute for both. Short descriptions are cleaner but thin; long ones carry page-builder markup. Map description with the HTML stripped, and give the rule the condition description matches regexp ^\s*$ (empty), which switches to short_description.
Let AI titles replace the combine only where Magento names are weak
Many Magento catalogs have supplier-style names ("TBL-OAK-180 Table"). An AI config can enhance titles from name, manufacturer, material and category; give the title rule the condition is accepted in AI config, with replace from AI config when it holds and the combine otherwise, so only the AI titles you accept in review replace it and nothing ships empty.
One feed per store view, not one feed with store_view_code
Each store view usually has its own currency, language and URL base. Separate feeds mean separate add prefix and add suffix rules, which is easier to debug than conditional mapping.
Keep gtin empty when the attribute is empty
Do not map sku into gtin to satisfy the spec. Google validates GTINs and a wrong one disapproves the item. Empty gtin with brand and mpn present is accepted for most new products.
FAQ
Questions about magento google shopping feed
Does Magento 2 have a Google Shopping feed built in?
No. Magento 2 exports products as a CSV from System → Data Transfer → Export, written to var/export/ in the background. A Google XML feed with a URL needs an extension; WeltPixel Product Feed is a free, open-source one that runs on a cron and is Google-only for now.
Can Textfinity connect to Magento directly?
Not with a plugin or API key. Textfinity reads a CSV, TSV or Google Shopping XML file reachable by URL, so a Magento store connects through the feed module's Google XML URL or a protected CSV export. Shopify is the only native connection.
How do I handle configurable products in a Magento Google Shopping feed?
Send the simple children, not the parent. Map each child's sku to id, the parent's sku to item_group_id, and include color and size. Filter out rows where product_type is configurable. Google then groups the children as variants of one listing.
How often does the Magento feed update in Merchant Center?
Three schedules chain together: the Magento module's cron writes the raw feed, Textfinity re-pulls it on the shop's sync schedule and rebuilds the Google feed (median rebuild 10.9 seconds on our platform), and Merchant Center fetches the Textfinity URL on the schedule you set in Data sources, typically daily.
Set up for you
We'll build your Magento Google Shopping feed from the export URL.
Send us the module's feed URL. We map the thirteen attributes above once, filter the parents out and register the feed in your Merchant Center with you. Magento catalogs are quoted per catalog after a short call.
Tell us your store and channels. We reply within 24 hours.