Hello!
We’ve built a sales channel app that uses contextual product feeds to sync products for Canadian merchants. We use cart permalinks to direct users to the products on the merchant’s shop.
We are aiming to achieve a uni-directional product sync (Shopify → our platform).
I have read through the sales channel documentation here: Apps as sales channels .
After reading through the docs, I understand there are multiple way to ‘sync’ products and inventory levels. From what I can tell, the best option for our use-case would be to use contextual product feeds. However, it seems this requires using some features from Shopify Markets which are in developer preview, and result in a warning message when a shop installs our app:
“Unsupported features: This app is not compatible with Markets, which may affect how some features work and lead to incorrect behavior. Contact (App Name) for more information.”
Implementation
I’d like to double check that I’m understanding how things work here. This is our current implementation:
- Shop installs the app and goes through a simple onboarding flow
- Subscribe to market webhooks
[MARKETS_CREATE ,MARKETS_UPDATE , MARKETS_DELETE] - Subscribe to product feed webhooks
[PRODUCT_FEEDS_FULL_SYNC, PRODUCT_FEEDS_FULL_SYNC_FINISH, PRODUCT_FEEDS_INCREMENTAL_SYNC, PRODUCT_FEEDS_UPDATE] - Query markets, and create a product feed for CA-EN (Canada/English)
From here, we listen on the following webhooks to keep products/inventory levels up-to-date for products published to our sales channel:
PRODUCT_FEEDS_FULL_SYNC
PRODUCT_FEEDS_INCREMENTAL_SYNC
PRODUCT_FEEDS_UPDATE
INVENTORY_LEVELS_UPDATE
Since the inventory_levels/update event only provides an inventory_item_id, and not a variant_id, we must also query for the inventory item information when receiving a new product in the product_feeds/* events. For this, we maintain a variant-to-inventory mapping in our db.
These message are then processed by the webhook handlers in the Shopify app, and passed into a queue for our inventory service consumer which applies some additional processing and stores the changes as our source-of-truth for our synced inventory.
Shopify → App Webhook Handler → Queue → Inventory Service
So this means our Shopify App receives the webhooks, and acts as a gateway (linking variants/inventory items) and sends out an enriched message which is handled by the Inventory Service (which never actually calls the Shopify API) and acts as a single source of truth for the inventory.
API Version: 2025-07
App type: Embedded saes channel app
Framework: Remix (Shopify template)
Questions:
- Does our architecture follow recommendations/best practices? I feel like I’m missing something here
- If yes, are we able to opt-in or remove the Markets compatibility warning