Catalog Feed Syncer
Cross-platform product feed sync — keeps your Shopify products in sync with Meta Catalog, Google Merchant Center, and TikTok Business Center Catalog.
Overview
The Catalog Feed Syncer is a single kit that replaces manual feed management across all your ad platforms. It pulls your Shopify product catalog, computes a diff against each destination, and (depending on your chosen mode) either reports discrepancies, queues write intents for your approval, or pushes changes immediately.
Three modes
| Mode | Behavior |
|---|---|
| Monitor | Computes diff and generates a feed health report. No writes. Ideal for auditing before enabling sync. |
| Approve First | Computes diff and queues write intents (upserts, deletes) for human review. You approve or reject each batch before it executes. |
| Auto | Computes diff and immediately pushes changes to selected destinations. Reports arrive after execution. |
All modes include pre-sync validation, diff awareness, and email notifications.
Setup
Step 1: Connect Shopify
You need an active Shopify integration with read_products and read_inventory scopes (both are requested by default during OAuth connection).
- Go to Settings > Integrations and connect your Shopify store if you haven't already
- In the kit setup form, select your Shopify integration from the dropdown
Step 2: Choose destinations
Select one or more sync destinations:
- Meta Catalog — Syncs to your Meta Commerce Manager product catalog (used for Dynamic Product Ads)
- Google Merchant — Syncs to a Google Merchant Center data source (used for Shopping and Performance Max campaigns)
- TikTok Catalog — Syncs to a TikTok Business Center catalog (used for Catalog Sales and Dynamic Showcase Ads)
By default, all destinations whose integrations are already connected will be pre-selected. You can deselect any you don't need.
Step 3: Configure Meta Catalog (if selected)
- Select your Meta Ads Integration from the dropdown
- Enter your Meta Catalog ID — find this in Commerce Manager (opens in a new tab) under Catalog > Settings
The kit uses the Graph API batch endpoint (POST /{catalog_id}/products) to push up to 100 items per request. Your Meta app must have catalog_management and business_management permissions (both are granted during the standard Meta Ads OAuth flow).
Step 4: Configure Google Merchant (if selected)
- Select your Google Ads Integration
- Select your Merchant Account from the dropdown
- Select a Data Source — this must be an "API" type data source you've pre-created in Merchant Center
Creating a data source in Google Merchant Center:
-
Go to Merchant Center (opens in a new tab) > Products > Feeds
-
Click Add product data > API
-
Name the feed (e.g., "Zimmer Sync") and select your target country and language
-
Copy the data source ID and paste it into the kit setup
-
Enter the Feed Label (e.g.,
US) — this must match the country you selected when creating the data source -
Enter the Content Language (e.g.,
en)
The kit uses the Merchant API v1beta (productInputs:insert) with per-item writes, throttled via p-limit(10) to stay within Google's rate limits.
Step 5: Configure TikTok Catalog (if selected)
- Select your TikTok Ads Integration
- Select a TikTok Catalog from the dropdown
Catalog permission requirement:
Your advertiser account must have catalog permission granted in Business Center. If this permission is missing, the kit will surface a clear error during the first sync attempt. To grant it:
- Go to TikTok Business Center > Assets > Catalogs
- Select your catalog
- Under Permissions, grant access to the advertiser account used in your integration
The kit uses the Marketing API batch endpoint (/catalog/product/upload/) with a batch size of 50 items per request.
Step 6: Choose sync mode
- Monitor — Start here. Review the first few reports to verify your Shopify data quality before enabling writes.
- Approve First — Recommended for production. You review and approve each batch of changes before they go live.
- Auto — For high-trust setups with clean Shopify data. Changes push immediately on each scheduled run.
Additional settings appear based on mode:
All write modes (approve_first, auto):
- Batch size — Items per write request (default 100, max 250)
- Delete stale products — Whether to hard-delete products that disappear from Shopify (default: off, uses soft out-of-stock marking instead)
- Stale debounce days — How many days a product must be absent before hard-delete (default: 7)
- Price change tolerance — Percentage threshold below which price changes are skipped (default: 0%)
- Validation threshold — Maximum percentage of products that can fail validation before aborting the run (default: 5%)
Monitor mode:
- Rejection rate threshold — Alert when platform rejection rate exceeds this percentage (default: 5%)
How sync works
Every sync run follows this pipeline:
- Fetch Shopify products — Pulls all products with variant-level detail via the REST Admin API
- Fetch destination state — Pulls current catalog contents from each selected destination
- Pre-sync validation — Checks required fields on the Shopify snapshot
- Compute diff — Determines what's new, changed, or stale per destination
- Execute — Based on mode: report only (monitor), queue for approval (approve_first), or write immediately (auto)
- Notify — Sends email report with results
Monitor mode
Produces a feed health report containing:
- Total products in Shopify vs. each destination
- Products missing from destinations (not yet synced)
- Products with field differences (price, title, availability mismatches)
- Products in destination but absent from Shopify (stale)
- Platform rejection status (Meta review rejections, Google disapprovals)
- Remediation checklist for any issues found
No writes are performed. Use this to audit your feed before enabling sync.
Approve-first mode
After computing the diff, the kit creates a batch of write intents — each showing:
- Product title and retailer ID
- Action type (upsert or delete)
- Before/after field comparison
- Destination platform
These appear in the agent's Activity tab as pending proposals. Approve or reject individual items or the entire batch. Approved writes execute within 1-5 minutes.
Auto mode
Same pipeline as approve-first, but writes execute immediately without waiting for approval. The run report arrives via email after completion, showing:
- Items successfully synced
- Items that failed (with error details)
- Items excluded by validation
- Post-sync status (pending review, approved, rejected)
A separate status-poll run fires 30 minutes after sync to check for platform review results (Meta and Google approvals can lag).
Pre-sync validation
Before any writes fire, the kit validates the Shopify snapshot:
| Field | Rule | Action if missing |
|---|---|---|
| Title | Non-empty string | Item excluded from sync |
| Image | At least one URL that returns HTTP 200 on HEAD request | Item excluded |
| Price | Greater than 0 | Item excluded |
| Availability | Inferred from inventory_quantity | Defaults to out_of_stock if null |
| GTIN | Present (recommended but not required) | Item included with warning |
Aggregate rule: If the percentage of excluded items exceeds the configured threshold (default 5%), the entire run is aborted and a remediation report is emitted listing every excluded item with its reason.
This prevents accidentally pushing a broken catalog (e.g., after a Shopify import went wrong) to your ad platforms.
Variant handling
By default, the kit uses the variants_with_item_group strategy:
- Each Shopify variant becomes an individual item in the destination catalog
- Variants of the same product share an
item_group_id(the Shopify product ID) - This enables platform features like "color" and "size" selectors in Dynamic Product Ads
Alternatively, select parents_only to sync only the parent product (first variant's data), ignoring variant expansion.
The kit supports up to Shopify's 250-variant-per-product limit. If a product exceeds this (extremely rare), only the first 250 variants are synced and a warning appears in the report.
Troubleshooting
Common rejection reasons
Meta:
- Missing GTIN — Meta recommends (but doesn't require) GTIN. Add barcodes in Shopify to resolve.
- Image too small — Meta requires images at least 500x500px. Replace with higher-resolution images in Shopify.
- Price mismatch — The price in your catalog doesn't match your landing page. Ensure Shopify prices are up to date.
- Description too short — Add more detail to your Shopify product descriptions.
Google:
- Missing required attributes — Google is stricter than Meta. Ensure
brand,gtinormpn,condition, andgoogle_product_categoryare populated. - Data source not found — The data source ID in your setup no longer exists. Create a new one in Merchant Center and update the kit configuration.
- Landing page mismatch — Your product URL returns a 404 or shows a different price. Verify Shopify handles are correct and store is public.
- Image quality — Google requires clear product images on white backgrounds for Shopping. Replace lifestyle images with product shots.
TikTok:
- Catalog permission not granted — The advertiser account doesn't have catalog access. Grant it in Business Center > Assets > Catalogs > Permissions.
- Invalid SKU ID format — Ensure Shopify variant IDs are being used correctly. Contact support if this persists.
- Image link unreachable — Your Shopify CDN image returned a non-200 response. Usually temporary; the next sync run will retry.
FAQ
Q: Can I run the syncer for only one destination? A: Yes. Select only the destination you need in the Sync Destinations field. The kit skips all logic for unselected platforms.
Q: What happens if my Shopify store is password-protected? A: The pre-sync validation will detect HTTP 401 responses when checking image reachability and abort with an instructional error. Remove the password or use a development store with password protection disabled.
Q: How often does the syncer run? A: By default, every 6 hours. You can change the schedule in the agent's Triggers tab (e.g., daily at 2 AM, hourly for high-volume stores).
Q: Will it delete products from my ad platforms?
A: Not by default. When a product disappears from Shopify, the kit marks it as out_of_stock in destinations (soft delete). Enable "Delete stale products" in setup to hard-delete items that have been absent for more than 7 days (configurable).
Q: Can I use this alongside the old Catalog Feed Manager? A: Yes, but it's redundant. The Syncer in monitor mode does everything the Manager does, plus adds diff awareness. We recommend switching to the Syncer and pausing or deleting the Manager agent.
Q: What about multi-currency or multi-locale feeds? A: v1 supports a single feed per destination. If you need multiple locales, create separate agents with different feed_label and content_language settings pointing to different Google data sources.