Skip to main content

Product & Collection Sync

How Brevo PushOwl syncs your Shopify product catalog, variants, and collections for personalized campaigns and product recommendations.

Written by Anand
Updated this week

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

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:

  1. Collections (categories) sync first

  2. Products sync next

  3. Product variants sync last

  4. 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 metaInfo

  • Variants sync with market-specific prices in metaInfo

  • Market 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:

  1. Check that the product is active/published in Shopify

  2. Wait a few minutes and refresh

  3. 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

Did this answer your question?