Feed Manager v26.3+
1. Introduction
Welcome to Maho FeedManager - a powerful module for exporting your product catalog to shopping platforms and marketplaces. Whether you're selling on Google Shopping, Facebook, Pinterest, or regional platforms like Idealo and Trovaprezzi, FeedManager makes it easy to create, customize, and automate your product feeds.
Supported Platforms
| Platform | Format |
|---|---|
| Google Shopping | XML (Atom) |
| Google Local Inventory | XML or CSV |
| Facebook / Meta | XML or CSV |
| Bing Shopping | XML or CSV |
| XML or CSV | |
| Idealo | CSV (EU markets) |
| Trovaprezzi | XML (Italy) |
| OpenAI Commerce | JSONL or CSV |
| Custom | XML, CSV, JSON, or JSONL |
Key Features
- Visual Mapping Builders - Drag-and-drop interface for XML, CSV, and JSON feeds
- Category Taxonomy Mapping - Map store categories to platform taxonomies (e.g., Google Product Categories)
- Dynamic Rules - Conditional logic for computed values (stock status, sale prices, etc.)
- Configurable Product Handling - Smart parent/child product relationships
- Transformers - Modify data on-the-fly (price adjustments, text formatting)
- Formats & Regional Settings - Per-feed price formatting, currency, and tax configuration
- Automated Scheduling - Hourly, daily, or custom generation schedules
- SFTP/FTP Uploads - Automatically push feeds to destinations
- Failure Notifications - Email and admin inbox alerts when feeds fail
2. Getting Started
Accessing FeedManager
Navigate to Catalog > Feed Manager in your Maho admin panel. You'll see four main sections:
- Feeds - Manage your product feeds
- Dynamic Rules - Create conditional attribute rules
- Category Mapping - Map store categories to platform taxonomies
- Destinations - Configure SFTP/FTP upload targets
Module Configuration
Go to System > Configuration > Catalog > Feed Manager to configure:
| Setting | Description | Default |
|---|---|---|
| Enable Module | Turn FeedManager on/off | Yes |
| Output Directory | Where feed files are saved (relative to media/) | feeds |
| Batch Size | Products processed per batch (lower = less memory) | 500 |
| Log Retention (Days) | How long to keep generation logs | 30 |
| Error Threshold (%) | Max percentage of products that can fail before aborting generation. Set to 0 to disable. | 10 |
3. Creating Your First Feed
Step 1: Basic Settings
Click "Add New Feed" and fill in the General tab:
| Field | Description |
|---|---|
| Feed Name | A friendly name (e.g., "Google Shopping - Main Store") |
| Feed Template | Combined platform and format selector (e.g., "Google Shopping - XML") |
| Store View | Which store's products and prices to export |
| Filename | Output filename (without extension) |
| Enabled | Turn the feed on or off |
The General tab also includes Schedule, Upload Settings (destination, auto-upload, gzip compression), and Notification settings.
Step 2: Product Selection
In the Filters tab, configure which products to include:
- Exclude Disabled - Skip disabled products
- Exclude Out of Stock - Skip products with no stock
- Product Types - Select which product types to include (simple, configurable, grouped, bundle, virtual, downloadable)
- Product Conditions - Standard rule conditions for advanced filtering (see Product Filtering)
Step 3: Attribute Mapping
The Mapping tab is where you define your feed structure. See the Mapping Builders section for details.
Step 4: Preview & Generate
Use the Preview tab to test your feed with a sample of products. When satisfied, click "Generate Now" to create the full feed.
4. Mapping Builders
FeedManager provides visual builders for each output format. All builders share the same powerful options for data sources.
Data Source Types
| Source Type | Description | Example |
|---|---|---|
| Attribute | Product attribute value | name, price, sku |
| Static | Fixed text value | new, AU, in stock |
| Rule | Dynamic Rule reference | stock_status, sale_price |
| Combined | Template with multiple values | {{brand}} - {{name}} |
| Category Taxonomy | Mapped platform category from Category Mapping | google, facebook |
Category Taxonomy Source
When you select "Category Taxonomy" as the source type, set the source value to the platform code (e.g., google). FeedManager will automatically look up the deepest mapped category for each product and output the platform's category path. See Category Mapping for setup.
XML Structure Builder
Build nested XML structures with full control over elements, attributes, CDATA, and namespaces.
Google Shopping Item
CSV Column Builder
Define columns, their order, and data sources. Configure delimiter (comma, tab, pipe) and text enclosure.
CSV Output
JSON Structure Builder
Create nested JSON objects with arrays and proper data types.
JSON Output
5. Using Parent Product Data
When exporting configurable product children, you often need data from the parent product. FeedManager's "Use Parent" feature handles this elegantly.
Use Parent Modes
| Mode | Behavior | Best For |
|---|---|---|
| Never | Always use child product's value | SKU, variant-specific attributes |
| If Empty | Use parent's value only if child's is empty | Description, brand, images |
| Always | Always use parent's value, ignore child's | URL, main product image, category |
Configurable T-Shirt with Size Variants
You have a configurable T-shirt with children for each size. Here's how to map attributes:
| Attribute | Use Parent | Reason |
|---|---|---|
| SKU | Never | Each variant has its own SKU |
| Name | If Empty | Use parent name if child doesn't have one |
| Description | Always | All variants share the same description |
| URL | Always | Link to main configurable page, not child |
| Image | If Empty | Use child image if available, else parent's |
| Price | Never | Each variant may have different pricing |
| Size | Never | Variant-specific attribute |
| Color | Never | Variant-specific attribute |
| item_group_id | N/A | Automatically set to parent's entity_id |
Item Group ID
When exporting configurable product children, FeedManager automatically adds item_group_id to link variants together. This tells platforms like Google Shopping that these products are variations of the same item.
6. Category Mapping
Most shopping platforms require products to be categorized using their own taxonomy. For example, Google Shopping uses the Google Product Taxonomy with over 6,000 categories. FeedManager lets you map your store categories to platform categories once, and all feeds using that platform will automatically use the correct values.
Accessing Category Mapping
Navigate to Catalog > Feed Manager > Category Mapping. Select a platform from the dropdown at the top to begin mapping.
How It Works
- Select a platform from the dropdown (e.g., Google, Facebook, Bing)
- Your store's category tree is displayed on the left
- For each category, type into the search field to find the matching platform category
- The search queries the bundled taxonomy file and shows matching results in a dropdown
- Click a result to apply the mapping
Mappings are global per platform -- once you map a category for Google, all Google Shopping feeds will use that mapping automatically via the "Category Taxonomy" source type.
Taxonomy Search
The search field supports multi-word queries. For example, typing tennis shoes will match any taxonomy entry containing both words. Results show the full category path and ID:
Searching for 'tennis'
Results might include:
3854-- Sporting Goods > Athletics > Tennis3855-- Sporting Goods > Athletics > Tennis > Tennis Racquets3856-- Sporting Goods > Athletics > Tennis > Tennis Balls1648-- Apparel > Shoes > Athletic Shoes > Tennis Shoes
Bulk Mapping
To quickly apply the same platform category to multiple store categories:
- Map one category first, then click its Copy button
- The page enters Bulk Mode -- the source row highlights in blue
- Click any other category row to apply the same mapping
- Use Shift+Click to apply to a range of categories
- Press Escape or click "Exit Bulk Mode" to finish
Auto-Map Unmapped
Click the "Auto-Map Unmapped" button to automatically match unmapped store categories to platform taxonomy entries by name. This uses a simple name-based search and takes the first result, so it's best used as a starting point that you then review and correct manually.
Using Category Mappings in Feeds
In your feed's attribute mapping, set the source type to "Category Taxonomy" and the source value to the platform code (e.g., google). FeedManager will automatically find the deepest (most specific) mapped category for each product and output the platform's category path.
Google Product Category Mapping
| Feed Attribute | Source Type | Source Value |
|---|---|---|
| google_product_category | Category Taxonomy |
If a product belongs to the store category "Tennis Racquets" which is mapped to Google's Sporting Goods > Athletics > Tennis > Tennis Racquets, the feed will output that full path.
Supported Taxonomies
| Platform | Taxonomy |
|---|---|
| Google Shopping | Google Product Taxonomy (bundled) |
| Facebook / Meta | Google Product Taxonomy (Facebook uses the same taxonomy) |
| Bing Shopping | Google Product Taxonomy (Bing accepts Google-formatted feeds) |
| Google Product Taxonomy | |
| Idealo | Google Product Taxonomy |
| Trovaprezzi | Google Product Taxonomy |
7. Dynamic Rules
Dynamic Rules let you create conditional, computed values based on product attributes. Think of them as "IF-THEN-ELSE" logic for your feed data.
How Dynamic Rules Work
A Dynamic Rule consists of multiple output rows, evaluated top-to-bottom. The first row whose conditions match determines the output. If no conditions match, the last row (usually a default) is used.
Pre-Built Rules
| Rule Code | Description | Output |
|---|---|---|
stock_status | Stock availability check | "in_stock" or "out_of_stock" |
availability | Google Shopping format | "in stock" or "out of stock" |
identifier_exists | GTIN/MPN presence check | "yes" or "no" |
sale_price | Special price when valid | special_price value or empty |
Conditions
Dynamic Rules use the standard Maho rule conditions widget -- the same interface used by Catalog Price Rules and Cart Price Rules. Each rule's Conditions tab lets you build conditions using a visual, point-and-click interface.
Available condition operators include:
| Operator | Description |
|---|---|
| is / is not | Exact match |
| equals or greater than / equals or less than | Numeric comparison |
| greater than / less than | Strict numeric comparison |
| contains / does not contain | Substring match |
| is one of / is not one of | Match against a list of values |
Creating Custom Rules
Custom Label for High-Value Products
Create a rule to label products based on price tiers for Google Shopping custom labels:
| Row | Condition | Output Type | Output Value |
|---|---|---|---|
| 1 | price greater than 500 | Static | premium |
| 2 | price greater than 100 | Static | mid-range |
| 3 | (default) | Static | budget |
Limited Stock Warning
Show "limited_availability" when stock is low:
| Row | Conditions | Output |
|---|---|---|
| 1 | qty greater than 10 | "in stock" |
| 2 | qty equals or less than 10, qty greater than 0 | "limited availability" |
| 3 | (default) | "out of stock" |
Image Fallback
Use a specific image attribute if available, otherwise fall back to base image:
| Row | Condition | Output Type | Output |
|---|---|---|---|
| 1 | google_image is not empty | Attribute | google_image |
| 2 | facebook_image is not empty | Attribute | facebook_image |
| 3 | (default) | Attribute | image |
8. Transformers
Transformers modify attribute values before they're added to your feed. You can chain multiple transformers together.
Available Transformers
Transformers are grouped by category in the UI.
Text Formatting:
| Transformer | Description | Options |
|---|---|---|
uppercase | Convert to UPPERCASE | -- |
lowercase | Convert to lowercase | -- |
capitalise | Capitalise text | mode (title, first, sentence) |
strip_tags | Remove HTML tags | allowed_tags, decode_entities |
truncate | Limit text length | max_length, suffix, word_boundary |
replace | Find & replace text | search, replace, is_regex, case_sensitive |
Values & Defaults:
| Transformer | Description | Options |
|---|---|---|
default_value | Fallback if empty | default, empty_includes_zero |
map_values | Replace values by mapping | mapping (key=value pairs), default, case_sensitive |
conditional | Output different values based on conditions | condition_field, operator, compare_value, true_value, false_value |
Numbers & Prices:
| Transformer | Description | Options |
|---|---|---|
format_price | Format as currency | currency, decimals, decimal_separator, thousands_separator, skip_if_empty |
round | Round numeric values | precision, mode (round, ceil, floor) |
Dates & URLs:
| Transformer | Description | Options |
|---|---|---|
format_date | Format date/time values | output_format, input_format, timezone |
url_encode | Encode values for URLs | encode_type (path, query, full) |
Advanced:
| Transformer | Description | Options |
|---|---|---|
prepend_append | Add text before/after value | prepend, append, skip_if_empty |
Transformer Syntax
Chain transformers using the pipe character: transformer1|transformer2:option=value
Clean Product Description for Google
Google Shopping has specific requirements for descriptions:
This removes HTML tags and limits to 5000 characters with "..." suffix.
Format Price for Google Shopping
Format a price with 2 decimals and currency suffix:
Input: 295 --> Output: 295.00 AUD
Map Stock Status Values
Convert numeric stock status to text:
Input: 1 --> Output: in stock
Combine Brand and Name
Create a formatted title:
Output: Nike - Air Max 90 (Black)
Google Shopping Title Optimization
Format title with brand prefix and length limit:
Round and Format a Price
Chain rounding with price formatting:
Input: 29.993 --> Output: 30,00 EUR
Prepend/Append Text
Add prefix and suffix to a value:
9. Formats & Regional Settings
Each feed has its own formatting and regional settings, configured in the Mapping tab under Formats & Regional Settings. These control how prices, numbers, and URLs are formatted in the output.
Number Format Presets
Select a preset to quickly configure decimal and thousands separators, or choose "Custom" to set them manually.
| Preset | Format | Example |
|---|---|---|
| English | Period decimal, comma thousands | 1,234.56 |
| European | Comma decimal, period thousands | 1.234,56 |
| Swiss | Period decimal, apostrophe thousands | 1'234.56 |
| Indian | Period decimal, comma thousands | 1,23,456.78 |
| Custom | Manually configure separators | -- |
Price Settings
| Setting | Description | Default |
|---|---|---|
| Price Currency | Currency code used for price output | Store's base currency |
| Price Decimals | Number of decimal places | 2 |
| Price Decimal Point | Character for decimal point (. or ,) | . |
| Price Thousands Separator | Character for thousands grouping (or empty for none) | (empty) |
| Append Currency to Prices | Add currency code suffix to prices (e.g., "295.00 AUD") | Yes |
Google Shopping (Australia)
Google requires prices in the format XX.XX CUR:
| Setting | Value |
|---|---|
| Preset | English |
| Currency | AUD |
| Decimals | 2 |
| Append Currency | Yes |
Output: 295.00 AUD
Idealo (Germany)
Idealo expects European number formatting:
| Setting | Value |
|---|---|
| Preset | European |
| Currency | EUR |
| Decimals | 2 |
| Append Currency | No |
Output: 295,00
Other Output Settings
| Setting | Description | Default |
|---|---|---|
| Tax Mode | Include or exclude tax from prices | Include Tax |
| Exclude Category from URL | Use direct product URLs without category path | Yes |
| No Image URL | Fallback image URL when a product has no image | (empty) |
10. Product Filtering
Use the Product Conditions widget in the Filters tab to precisely control which products appear in your feed. This uses the same rule conditions interface as Catalog Price Rules and Cart Price Rules.
How Conditions Work
The conditions widget uses a visual, point-and-click interface:
- Click the green + button to add a new condition
- Select a product attribute (e.g., price, category, SKU)
- Choose an operator (is, is not, greater than, contains, etc.)
- Set the comparison value
Conditions can be nested with ALL (AND) or ANY (OR) logic using the "If ALL/ANY of these conditions are TRUE" selector.
Export Specific Categories with Price Threshold
If ALL of these conditions are TRUE:
- Category is one of 10, 15
- Price greater than 20
Common Filter Patterns
| Use Case | Condition Setup |
|---|---|
| Only products with images | image is not empty |
| Exclude certain brands | brand is not one of Brand1, Brand2 |
| Only visible products | visibility is one of Catalog, Catalog/Search |
| Minimum price threshold | price greater than 10 |
| In-stock only | quantity greater than 0 |
Product Types Filter
For filtering by product type, use the dedicated Product Types multiselect field in the Filters tab instead of a condition. This provides a cleaner interface for selecting simple, configurable, grouped, bundle, virtual, or downloadable products.
11. Upload Destinations
Automatically upload generated feeds to SFTP/FTP servers.
Creating a Destination
Navigate to Catalog > Feed Manager > Destinations and click "Add New Destination".
| Field | Description |
|---|---|
| Name | Friendly name for the destination |
| Type | SFTP or FTP |
| Host | Server hostname or IP |
| Port | Connection port (22 for SFTP, 21 for FTP) |
| Username | Login username |
| Auth Type | Password or Private Key |
| Remote Path | Directory path on remote server |
Linking Feeds to Destinations
In your feed's General tab, select the destination and enable "Auto Upload" to automatically push the feed after each generation.
12. Notifications
FeedManager can alert you when feed generation or upload fails. Notifications are configured per-feed in the feed edit form.
Notification Settings
| Setting | Options | Description |
|---|---|---|
| Notification Method | None, Email Only, Admin Inbox Only, Both | How to deliver failure alerts |
| Notification Frequency | Every Failure, Once Until Success | How often to send alerts |
| Notification Email | (text field) | Recipient email(s), comma-separated. Defaults to store general contact. |
Notification Methods
| Method | Behavior |
|---|---|
| None | No notifications sent (default) |
| Email Only | Sends an email with feed name, failure type, and error details |
| Admin Inbox Only | Adds a critical-level notification to the Maho admin inbox |
| Both | Sends both email and admin inbox notification |
Notification Frequency
| Frequency | Behavior |
|---|---|
| Every Failure | Sends a notification on every failed generation or upload |
| Once Until Success | Sends one notification on the first failure, then suppresses further alerts until the feed generates successfully. After a success, alerts are re-enabled for the next failure. |
What Triggers Notifications
- Generation failure -- Feed generation encounters errors (validation, product processing, etc.)
- Upload failure -- Feed file fails to upload to a configured destination
- Timeout -- Feed generation is stuck for more than 30 minutes
'Once Until Success' for Scheduled Feeds
If a feed runs hourly and fails repeatedly due to a configuration issue, "Once Until Success" prevents your inbox from being flooded. You'll get one alert, fix the issue, and the next successful run resets the flag automatically.
13. Scheduling & Automation
Schedule Options
| Schedule | Description |
|---|---|
| Hourly | Generate every hour |
| Every 6 Hours | Generate four times per day |
| Daily | Generate once per day at midnight |
| Twice Daily | Generate at midnight and noon |
| Manual Only | No automatic generation |
Cron Jobs
FeedManager registers these cron jobs:
- feedmanager_generate_scheduled - Runs hourly, generates feeds based on their schedules
- feedmanager_cleanup_logs - Runs daily at 3:30 AM, removes old logs
Cron Must Be Running
Scheduled generation requires Maho's cron system to be properly configured. Verify cron is running:
14. CLI Commands
FeedManager provides command-line tools for automation and debugging.
Available Commands
# List all feeds with status
./maho feed:list
# Generate a specific feed
./maho feed:generate 4
# Generate all enabled feeds
./maho feed:generate:all
# Generate all feeds (including disabled)
./maho feed:generate:all --include-disabled
# Validate a feed without regenerating
./maho feed:validate 4
Cron Script for Custom Scheduling
Add to your system crontab for custom generation times:
15. Troubleshooting
Common Issues
Feed shows 0 products
- Check your filter conditions -- they may be too restrictive
- Verify "Exclude Disabled" and "Exclude Out of Stock" settings
- Ensure products exist in the selected store view
- Check the Product Types selection in the Filters tab
Feed generation times out
- Reduce batch size in System Configuration
- Use CLI command instead of admin interface for large catalogs
- Enable gzip compression to reduce file size
SFTP upload fails
- Verify credentials by testing connection
- Check remote directory exists and is writable
- Ensure server's IP is whitelisted on destination
- Check PHP has required extensions (ssh2 for SFTP)
Dynamic Rule not working
- Verify rule is enabled
- Check condition operators and values
- Use Preview to test with sample products
- Ensure attribute code matches exactly (case-sensitive)
Category Taxonomy shows empty in feed
- Verify you've mapped categories for the correct platform under Catalog > Feed Manager > Category Mapping
- Check the source value is set to the platform code (e.g.,
google) - Ensure the product belongs to at least one mapped category
- Use Preview to check individual product output
Checking Logs
Generation logs are stored in the database and viewable in the feed's Logs tab. System errors are logged to:
Getting Help
For issues or feature requests, visit: github.com/MahoCommerce/maho