Building Agents
Catalog Feed Syncer

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

ModeBehavior
MonitorComputes diff and generates a feed health report. No writes. Ideal for auditing before enabling sync.
Approve FirstComputes diff and queues write intents (upserts, deletes) for human review. You approve or reject each batch before it executes.
AutoComputes 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).

  1. Go to Settings > Integrations and connect your Shopify store if you haven't already
  2. 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)

  1. Select your Meta Ads Integration from the dropdown
  2. 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)

  1. Select your Google Ads Integration
  2. Select your Merchant Account from the dropdown
  3. 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:

  1. Go to Merchant Center (opens in a new tab) > Products > Feeds

  2. Click Add product data > API

  3. Name the feed (e.g., "Zimmer Sync") and select your target country and language

  4. Copy the data source ID and paste it into the kit setup

  5. Enter the Feed Label (e.g., US) — this must match the country you selected when creating the data source

  6. 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)

  1. Select your TikTok Ads Integration
  2. 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:

  1. Go to TikTok Business Center > Assets > Catalogs
  2. Select your catalog
  3. 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:

  1. Fetch Shopify products — Pulls all products with variant-level detail via the REST Admin API
  2. Fetch destination state — Pulls current catalog contents from each selected destination
  3. Pre-sync validation — Checks required fields on the Shopify snapshot
  4. Compute diff — Determines what's new, changed, or stale per destination
  5. Execute — Based on mode: report only (monitor), queue for approval (approve_first), or write immediately (auto)
  6. 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:

FieldRuleAction if missing
TitleNon-empty stringItem excluded from sync
ImageAt least one URL that returns HTTP 200 on HEAD requestItem excluded
PriceGreater than 0Item excluded
AvailabilityInferred from inventory_quantityDefaults to out_of_stock if null
GTINPresent (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, gtin or mpn, condition, and google_product_category are 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.