Brevo PushOwl syncs your entire Shopify product catalog, including all variants and collections. This enables you to send personalized product recommendations, abandoned cart emails, and targeted campaigns based on what customers have browsed or purchased.
Understanding Products and Variants in Shopify
In Shopify, a product represents a single item you sell (e.g., "Classic Cotton T-Shirt"). Each product can have multiple variants, which are different versions of that product based on options like size, color, or material (e.g., "Blue / Large", "Red / Small").
A product holds the shared information: title, description, images, vendor, and product URL
A variant holds the specific details: its own price, SKU, inventory quantity, and optionally its own image
Brevo PushOwl syncs both products and their variants separately, so you can target customers at either the product level or the variant level in your campaigns.
Product Data Synced
Your synced products appear in Brevo under Commerce → E-commerce → Products. Each product shows its name, price, and SKU, confirming the sync is working.
Shopify → Brevo Product Field Mapping
Field | Type | Source (Shopify Field) | Description |
id | string | admin_graphql_api_id | Numeric ID extracted from Shopify GID (e.g., gid://shopify/Product/8588301893684 → 8588301893684) |
name | string | title | Product title from Shopify |
url | string | handle | Constructed as https://{shop_domain}/products/{handle} |
imageUrl | string | null | image.src | Featured image URL, null if no image exists |
sku | string | Same as id | Product ID (Shopify products don't have SKU at product level, only variants do) |
metaInfo.description | string | Hardcoded | Always empty string "" |
metaInfo.vendor | string | vendor | Product vendor/brand from Shopify |
parentId | null | Hardcoded | Always null (products have no parent; only variants do) |
price | float | First variant's price | First non-null price from variants array |
categories | array<string> | collection[].id | Collection IDs the product belongs to (added post-transformation) |
Example Brevo Product Payload
{
"id": "8588301893684",
"name": "Umbrella",
"url": "https://na-new-product-model.myshopify.com/products/umbrella",
"imageUrl": "https://cdn.shopify.com/s/files/1/0681/8640/6964/files/...",
"sku": "8588301893684",
"metaInfo": {
"description": "",
"vendor": "na-new-product-model"
},
"parentId": null,
"price": 100,
"categories": [
"299005116468"
]
}
For stores using Shopify Markets, the product's metaInfo also includes locale-specific entries keyed by {language}-{country}-{currency}:
{
"id": "8630762078296",
"name": "Selling Plans Ski Wax",
"url": "https://test-multi-markets-2.myshopify.com/products/selling-plans-ski-wax",
"imageUrl": "https://cdn.shopify.com/s/files/1/0701/2768/1624/files/snowboard_wax.png",
"sku": "8630762078296",
"price": 9.95,
"metaInfo": {
"description": "",
"es-ES-EUR": {
"currency": "EUR",
"name": "Planes de venta de cera para esquís"
},
"es-US-USD": {
"currency": "USD",
"name": "Planes de venta de cera para esquís"
},
"fr-FR-EUR": {
"currency": "EUR",
"name": "Vente de plans de fartage de ski"
},
"fr-US-USD": {
"currency": "USD",
"name": "Vente de plans de fartage de ski"
}
}
}
Variant Data Synced
Click any product to view its variants. Each variant displays its own price, SKU, and performance metrics.
Shopify → Brevo Variant Field Mapping
Each product variant is synced as a separate item in Brevo, linked to its parent product via parentId. In Shopify, price and inventory stock are stored at the variant level, not the product level.
Field | Type | Source (Shopify Field) | Description |
id | string | admin_graphql_api_id | Numeric ID extracted from Shopify GID (e.g., gid://shopify/ProductVariant/123 → 123) |
name | string | title + product_name | If variant title is "Default Title", uses product name; otherwise "{product_name} - {variant_title}" |
url | string | Parent product's URL | Same as parent product URL (variants don't have their own URL in Shopify) |
imageUrl | string | null | image_id matched in images[] | Variant-specific image if available, otherwise falls back to product's featured image |
sku | string | sku | Variant's SKU from Shopify (can be empty string) |
metaInfo.description | string | Hardcoded | Always empty string "" |
metaInfo.vendor | string | vendor | Product vendor/brand from parent product |
metaInfo.inventory_policy | string | inventory_policy | Shopify inventory policy ("deny" or "continue") |
metaInfo.stock | int | null | inventory_quantity | Current inventory quantity |
metaInfo.{locale-currency} | object | Shopify Markets | Market-specific pricing (see Market Fields below) |
parentId | string | Parent product's id | Links variant to its parent product |
price | float | price | Variant price (only added if non-null) |
stock | int | inventory_quantity | Inventory quantity (only added if non-null) |
categories | array<string> | collections[].id | Collection IDs the product belongs to |
Market-Specific Fields (Shopify Markets)
When Shopify Markets is enabled, variant metaInfo includes market-specific pricing with keys in the format {language}-{country}-{currency} (e.g., en-MX-MXN, de-MX-MXN):
Field | Type | Description |
metaInfo.{locale-currency}.price | float | Contextual price for the specific market |
metaInfo.{locale-currency}.currency | string | Currency code for the market (e.g., MXN, USD, EUR) |
Example Brevo Variant Payload
{
"id": "46907529494580",
"name": "Umbrella",
"url": "https://na-new-product-model.myshopify.com/products/umbrella",
"imageUrl": "https://cdn.shopify.com/s/files/1/0681/8640/6964/files/...",
"sku": "",
"metaInfo": {
"description": "",
"vendor": "na-new-product-model",
"inventory_policy": "deny",
"stock": 1000,
"en-MX-MXN": {
"price": 20,
"currency": "MXN"
},
"de-MX-MXN": {
"price": 20,
"currency": "MXN"
}
},
"parentId": "8588301893684",
"price": 100,
"stock": 1000,
"categories": [
"299005116468"
]
}
For stores with Shopify Markets, here's a variant with multi-market pricing:
{
"id": "43648718930008",
"name": "Selling Plans Ski Wax - Selling Plans Ski Wax",
"url": "https://test-multi-markets-2.myshopify.com/products/selling-plans-ski-wax",
"imageUrl": "https://cdn.shopify.com/s/files/1/0701/2768/1624/files/snowboard_wax.png",
"price": 24.95,
"parentId": "8630762078296",
"metaInfo": {
"description": "",
"en-CA-USD": {
"currency": "USD",
"price": 24.95
},
"en-US-USD": {
"currency": "USD",
"price": 24.95
},
"es-ES-EUR": {
"currency": "EUR",
"price": 21.95
},
"es-US-USD": {
"currency": "USD",
"price": 24.95
},
"fr-FR-EUR": {
"currency": "EUR",
"price": 21.95
},
"fr-US-USD": {
"currency": "USD",
"price": 24.95
}
}
}
Collection Data Synced
Collections in Shopify are synced as Categories in Brevo. Products are automatically added to their respective categories during sync.
Shopify → Brevo Collection Field Mapping
Field | Type | Source (Shopify Field) | Description |
id | string | admin_graphql_api_id | Numeric ID extracted from Shopify GID (e.g., gid://shopify/Collection/297582329008 → 297582329008) |
name | string | title | Collection title from Shopify |
Example Brevo Collection (Category) Payload
{
"id": "297582329008",
"name": "Automated Collection"
}
Product-Collection Relationships
Brevo PushOwl tracks which products belong to which collections, enabling you to:
Send campaigns about products in specific collections
Create segments based on collection interest
Recommend related products from the same collection
Sync Timing
Historical Sync
During the first sync, your entire catalog is imported:
Store Size | Estimated Time |
Small | Under 30 minutes |
Medium | Under 1 hour |
Large | 2 - 4 hours |
Very Large | Up to 24 hours |
Note: These times are approximate and may vary depending on the number of products, variants, and collections in your store.
Products and collections sync in this order:
Collections (categories) sync first
Products sync next
Product variants sync last
Product-collection relationships are then mapped
Real-Time Updates
After the historical sync, changes sync automatically:
Change Type | Sync Speed |
New product created | Near real-time |
Product title/price updated | Near real-time |
New variant added | Near real-time |
Collection created | Near real-time |
Products added to collection | Near real-time |
What Triggers a Product Sync?
Brevo PushOwl listens to these Shopify events:
Product Created: New products are immediately synced
Product Updated: Any change to product details triggers a sync
Collection Created: New collections are added as categories
Collection Updated: Collection names and products are updated
Using Product Data in Campaigns
Product Recommendations
Use synced product data to power:
Recently viewed: Show products customers browsed
Abandoned cart: Display exact items left in cart
Cross-sell: Recommend products from same collection
New arrivals: Feature recently added products
Dynamic Content
Insert product details dynamically in emails:
Product images
Current prices
Direct purchase links
Product names
Collection-Based Targeting
Target customers based on collection interest:
"Customers who viewed Summer Collection items"
"Customers who purchased from Sale collection"
"Customers interested in [Brand Name] products"
Product Images
Image Requirements
Product images synced to Brevo PushOwl must meet these constraints:
Maximum size: 5 MB
Accepted formats: JPEG, JPG, PNG, BMP, GIF
Best practices:
Use consistent image dimensions across products
Ensure featured images are set for all products
Variant images sync when available
Missing Images
If a product doesn't have an image:
The product still syncs (without imageUrl)
You may want to add images for better email appearance
Variant images fall back to the parent product image
Price Handling
Which Price Syncs?
Product level: First non-null variant price
Variant level: Actual variant price
Multi-Currency (Shopify Markets)
For multi-market stores:
Products sync with localized names per market in
metaInfoVariants sync with market-specific prices in
metaInfoMarket keys follow the format
{language}-{country}-{currency}Customers see prices in their local currency when used in campaigns
Common Questions
Why isn't my new product showing up?
New products should sync within seconds. If not:
Check that the product is active/published in Shopify
Wait a few minutes and refresh
Check the Sync Overview guide for troubleshooting
Can I manually trigger a product sync?
Yes, you can manually trigger a product sync from the Settings → Synchronisation page.
Are draft products synced?
Only published/active products are synced. Draft products are excluded until published.
What about product metafields?
Custom product metafields can also be synced. Contact our support team to enable product metafield syncing for your store.
Related Articles
Sync Your Shopify Data with Brevo PushOwl: Overview of all data sync capabilities
Customer Data Reference: Customer fields and attributes synced from Shopify
Order & Event Tracking: Order data and lifecycle events including line items
Attribute Mapping (Custom Metafields): Sync custom metafields from Shopify to Brevo


