How to Sync an External WhatsApp Catalog
ProfilePilot Team | Aug 28, 2026 | 10 min read
Connect WooCommerce, Shopify, Magento, eSolve, or a GMC/Meta product feed so ProfilePilot mirrors products for chat, Flows, and the kitchen queue.
Step 1: Why ProfilePilot mirrors your catalog
WhatsApp chat and Flows data_exchange must respond within Meta’s 15 second SLA. ProfilePilot therefore never calls WooCommerce/Shopify on every customer message.
Instead:
``` External store → scheduled sync → whatsapp_products → chat / Flows / kitchen ```
- Cron runs every 30 minutes for due sources (`/api/cron/whatsapp-catalog-sync`).
- Sync now on the Catalog tab runs a full manual ingest.
- Test connection validates credentials and fetches a sample — it does not replace a full sync.
Manual rows on Products (`sync_managed = false`) are untouched by sync. Synced rows get `catalog_source_id` and can be auto-disabled when they disappear from the feed (stale count in ingest logs).
Step 2: Choose a source type
Open WhatsApp Orders → Catalog (retail mode).
| Source | You need | | --- | --- | | WooCommerce | Store URL + REST consumer key/secret | | Shopify | Shop domain + Admin API access token | | Magento | Base URL + integration token | | eSolve | API base + credentials per your deployment | | GMC / Meta feed | Public HTTPS XML/CSV feed URL (Merchant Center shape) | | Generic REST | JSON product list endpoint + field mapping |
One primary source per org (V1). Legacy org-level feed URLs are migrated to a `gmc_feed` source automatically.
Required mapped fields: SKU (`id`), title, price, availability, image_link (recommended), product_type / category (recommended).
Step 3: Configure, test, and sync
- Add or edit the catalog source on the Catalog tab.
- Click Test connection — confirm sample products appear and credentials work.
- Click Sync now — wait for ingest to finish; check Products for Synced badges and counts.
- Review latest ingest run (added/updated/stale/errors).
Tips:
- WooCommerce: use REST API keys with read access to products.
- Shopify: custom app token with `read_products`.
- GMC feed: must be HTTPS and reachable from ProfilePilot servers (no localhost).
- After changing source, run Sync now before testing Flows — the Flow CATALOG screen reads `whatsapp_products`, not your store API.
Step 4: Specials, departments, and chat search
Synced products power:
- Product name search in WhatsApp chat (retail).
- Specials browse — mark `is_special` on Products (manual or feed field if mapped).
- Departments / categories — mapped from `product_type` or category columns.
- Flows checkout dropdown on the CATALOG screen (titles truncated to Meta’s 30-character limit; SKU used as stable id).
If chat says “No matches” for `menu` or `products`, confirm retail browse intents are configured and the catalog sync completed with available items (`is_available = true`).
Step 5: Troubleshooting
| Symptom | Check | | --- | --- | | 0 products after sync | Test connection errors; API permissions; empty store | | Products in PP but empty Flow dropdown | Wrong org selected; run Sync now; products must be `is_available` | | Stale prices in chat | Wait for cron or Sync now; chat never hits live API | | Manual product disappeared | Only synced SKUs are stale-disabled; manual rows stay | | Duplicate SKUs | SKU is unique per org — dedupe in source system |
Wholesale RESTOCK numbers and B2B pricing are separate roadmap items — B2C catalog sync does not expose wholesale price lists to consumer chat.
Keep learning
See the latest guides, experiments, and rollouts.