Work searchabee Guides How webhook sync works

How webhook sync works

Shopify webhooks drive the per-shop index. Understanding the flow.

Updated

Operational

searchabee’s index stays fresh via Shopify webhooks. Understanding the flow helps when something looks off.

Webhooks we subscribe to

  • products/create, products/update, products/delete
  • collections/create, collections/update, collections/delete
  • inventory_levels/update
  • product_listings/add, product_listings/remove (for publishing state)

Each webhook fires a differential update to the shop’s Meilisearch index. Typical end-to-end latency (webhook → index updated → next query sees change): 2–5 seconds.

What happens on each event

products/update

  1. Webhook arrives at searchabee.
  2. searchabee fetches the full product via GraphQL (webhook payloads are often partial).
  3. Transforms to the indexed shape (variants flattened, filter fields extracted).
  4. Upserts into the Meilisearch index.

inventory_levels/update

  1. Webhook arrives.
  2. If any searchabee filter source depends on availability, the affected variant’s document is updated.
  3. Otherwise no-op (saves cycles).

What this means operationally

  • Bulk imports fire a lot of webhooks quickly. searchabee queues them on Redis Streams and processes at a steady rate, respecting Shopify’s webhook rate limit tolerance. You may see a few seconds of index lag during a 10k-product import.
  • Draft products are excluded. If a product is not published to the Online Store channel, it’s not in the index.
  • Soft-deleted products (deleted then restored) re-appear in the index on the next webhook.

Debugging sync

searchabee console → Sync → Activity shows every webhook received, the action taken, and the resulting index state. Filter by product ID to see the history for a specific SKU.

If a product seems to be stale in the index:

  1. Check Activity — did the webhook arrive? If not, it’s a Shopify-side issue (check Shopify Admin → Notifications → Webhooks).
  2. Force-sync that product: Products → [product] → Resync. This triggers a direct GraphQL pull and upsert, bypassing webhook.

Full resync

A full resync rebuilds the entire index from scratch. Only do this when:

  • You’ve restructured filter trees and need to re-derive attributes.
  • The index is demonstrably corrupted (rare).

Sync → Rebuild index triggers it. Expect the initial-backfill timings from the large catalogs guide.