Skip to main content

Subscribed webhooks

Layers listens to the following Shopify Webhooks to maintain synchronization:
  • product/create: Triggers when a new product is added to your Shopify store.
  • product/update: Fires when any changes are made to existing products or their related items like variants or metafields.
  • product/delete: Activates when a product is permanently removed from your Shopify catalog.
  • variants/in_stock: Fires when a variant is restocked in Shopify.
  • variants/out_of_stock: Fires when a variant sells out in Shopify.
  • collections/create: Triggers when a new smart or custom collection is created in Shopify.
  • collections/update: Triggers when smart collection rules or custom collections are updated in Shopify.
  • collections/delete: Fires when a smart or custom collection is deleted from Shopify.
  • orders/create: Fires when an order is created in Shopify.
  • metaobjects/create: Fires when a metaobject is created in Shopify. Registered per metaobject definition type.
  • metaobjects/update: Fires when a metaobject is updated in Shopify. Registered per metaobject definition type.
  • metaobjects/delete: Fires when a metaobject is deleted from Shopify. Registered per metaobject definition type.
  • app/uninstalled: Fires when the Layers app is uninstalled from your Shopify store.
*Order webhooks are only subscribed to to calculate product and variant level sales metrics. PII is not ingested or retained.

Synced content

The synchronization includes all active products and variants, as well as associated media. It also encompasses all Product, Variant, and Shopify’s Standard Product Taxonomy Metafields specified under the Metafields & Metaobjects configuration.

Sales channel visibility

Layers imports and indexes all active products, including those published only to non-online-store sales channels (such as mobile app channels). During each catalog sync, Layers checks every product’s Shopify publication status and records which sales channels it is published to. This per-channel data is then used at query time to ensure customers only see products available in their current channel. How channel filtering works:
  • Web/online store requests: Only products published to the Shopify “Online Store” sales channel appear in search, browse, and block results. This filter is applied automatically — you do not need to set any parameters.
  • Mobile app requests: When shoppingChannel is set to "app" (automatically detected for Tapcart, Fuego, and Canvas integrations), products are filtered by your app sales channel instead. Products published exclusively to the app channel appear in results even if they are not published to the online store. You can configure which sales channel represents your app storefront in Search Behavior settings.
  • Dashboard/merchandising: All products are visible regardless of sales channel publication status, allowing you to manage your entire catalog.
  • Blocks and recommendations: The same channel-aware filtering applies to block results, so recommendation widgets only surface products the customer can actually purchase in their current channel.
Channel visibility is synced automatically during product imports and real-time webhook updates. If you change a product’s sales channel assignments in Shopify, the update is reflected in Layers after the next sync or webhook event. For stores that only use the baseline Shopify publications (Online Store, POS, Shop, Shop Mini), the per-product publication sync is skipped by default — see per-product publication sync to override this.

Scheduled publications

Layers tracks products that are scheduled to be published to a sales channel at a future date. When you set a future publish date for a product in Shopify, Layers records the scheduled status and automatically makes the product visible once the publish date arrives. How it works:
  • During each product sync, Layers captures the publication status for every sales channel — including whether the product is currently published, scheduled for a future date, or unpublished.
  • A background process runs every minute to check for scheduled products whose publish date has passed. When a product’s scheduled publish date arrives, Layers re-syncs its publication data from Shopify and updates channel visibility accordingly.
  • Products that are scheduled but not yet live are not included in search, browse, or block results until their publish date.
No configuration is required — scheduled publication tracking is automatic for all stores.

Configuring catalog sync

To adjust your catalog sync settings:
  1. Go to the Settings page on the Layers dashboard.
  2. Select the Metafields & Metaobjects tab.
  3. Here, you can configure the product and variant metafields captured in the sync.

Excluding metafield definitions

You can control which product and variant metafield definitions are synced from Shopify to Layers. This allows you to exclude metafields that aren’t needed for search and browse functionality, keeping your catalog data focused and efficient.

How to exclude metafield definitions

  1. Go to SettingsMetafields & Metaobjects in the dashboard.
  2. Scroll to the Metafield Definitions card.
  3. Metafield definitions will load automatically from your Shopify store, organized by namespace.
  4. Toggle individual metafields on or off to include or exclude them from sync.
  5. Use the Select All / Deselect All checkbox to quickly manage all metafields at once.
  6. Save your changes.

Important notes

  • Excluded metafields persist: Once you exclude a metafield definition and save, it will remain excluded on all subsequent catalog syncs until you re-enable it.
  • Automatic loading: Metafield definitions are fetched automatically when you visit the configuration page—no manual refresh is needed.
  • Applies to new syncs: Exclusions only affect future syncs. To remove already-synced metafield data, you’ll need to trigger a full catalog resync after updating your exclusions.
  • Relates to Synced Content: The metafields you select here determine which Product, Variant, and Standard Product Taxonomy Metafields are included in the “Synced Content” described above.

Configure export schedule

By default your entire catalog is resynced from Shopify every eight hours. Please contact support to adjust this schedule.

Sync opt-in controls

Two of the heaviest sync paths — per-product publication tracking and per-variant-per-location inventory tracking — are only useful for stores that meet specific conditions. Layers detects those conditions automatically and turns the syncs on or off for you, and you can override the decision at any time from the dashboard. Each toggle has three modes:
  • Auto (default): Layers decides based on your store configuration. The current decision is shown inline, for example “Auto (currently: On)”.
  • Always on: Force the sync to run regardless of auto-detection.
  • Always off: Skip the sync even if auto-detection would enable it.
Switching from Always off to Always on (or from Auto when conditions change) takes effect on the next catalog sync. Data that was skipped while the sync was off is backfilled the next time the relevant bulk export runs.

Per-product publication sync

What it does: Tracks which Shopify publication each individual product belongs to. Layers uses this data to filter search, browse, and block results by sales channel — for example, only showing products published to the Online Store on web requests, or only showing app-channel products on mobile app requests. When to use it: You need per-product publication data when your store has publications beyond the Shopify defaults (Online Store, POS, Shop, and Shop Mini). Common examples include Tapcart, Fuego, or Canvas mobile apps, wholesale channels, or any custom Shopify sales channel. Auto-detection logic: Layers enables this sync automatically when it sees at least one publication on your store whose handle is not online_store, pos, shop, or shop_mini. If your store only uses those baseline handles, the base product status already tells Layers whether a product is visible on the web, so the per-product sync is skipped to save sync time. How to configure it:
  1. Go to SettingsSales Channel in the Layers dashboard.
  2. Locate the Publication Sync card.
  3. Use the Per-product publication sync selector to choose Auto, Always on, or Always off.
  4. Save your changes.
Turn this sync Always on if you run an app-only product strategy and need Layers to filter those products correctly for mobile app requests even when Shopify has not reported the app publication yet. Turn it Always off only if you are certain that no per-product publication differences exist in your catalog.

Per-variant, per-location inventory sync

What it does: Tracks available quantity for each variant at each Shopify location. This is the data source for the online-fulfilling locations availability calculation and for the variants.in_stock_location_ids field used in location-aware sort orders. When to use it: You need per-location inventory when your store has more than one active location that fulfills online orders — for example, a warehouse plus multiple retail stores that ship to customers. When you only have a single online-fulfilling location, variant-level totals from Shopify are sufficient and the per-location sync adds no extra signal. Auto-detection logic: Layers enables this sync automatically when your store has more than one active location with fulfills_online_orders = true and no deactivated_at timestamp. Single-location stores, and stores whose extra locations only fulfill in-person orders, default to off. How to configure it:
  1. Go to SettingsMerchandising in the Layers dashboard.
  2. Locate the Inventory Sync card.
  3. Use the Per-variant, per-location inventory sync selector to choose Auto, Always on, or Always off.
  4. Save your changes.
If Layers is missing the Shopify permissions required to read inventory levels, the selector is disabled and an amber warning is shown. Grant the missing scopes in Shopify and reinstall or reauthorize the app to re-enable inventory sync.
Related features that depend on this sync:
  • Online-fulfilling locations availability — requires per-location inventory data to narrow availability to shippable locations.
  • variants.in_stock_location_ids — only populated when per-location inventory sync is on.
  • Location-aware sort orders that demote products out of stock at specific locations.
If any of these features are enabled for your store, keep this sync on Auto or Always on.

Variant availability calculation

Layers calculates variant availability to determine which products and variants are shown as available in search and browse results. By default, Layers uses Shopify’s availableForSale field, which considers inventory across all locations.

Digital products and untracked inventory

Variants that do not have inventory tracking enabled in Shopify (such as digital downloads or services) are always treated as available. Because these products have no physical stock to deplete, Layers skips inventory-based availability checks and keeps them visible in search and browse results regardless of variants/in_stock or variants/out_of_stock webhook events. No configuration is required — this behavior applies automatically to any product where Shopify reports that inventory is not tracked.

Gift cards

Shopify gift cards are automatically treated as always available. Because gift cards are virtual products with no physical inventory to deplete, Layers ensures they remain visible in search and browse results at all times — even if Shopify sends variants/out_of_stock webhook events for them. This applies to any product where Shopify’s isGiftCard flag is true. No configuration is required.

Always-available vendors

Some vendors sell digital products (such as gift cards from Rise.ai) that use tracked inventory in Shopify but should never appear as out of stock. Because these products have inventory management enabled with a quantity of zero, Layers would normally mark them as unavailable. To prevent this, you can configure an always-available vendors list. Products from any vendor on this list are treated as always available, regardless of their inventory level or inventory policy. How it works:
  • Vendor matching is case-insensitive — entering rise.ai matches products with the vendor set to Rise.ai, RISE.AI, or any other casing.
  • The check applies during both bulk availability recalculations and real-time webhook updates (variants/in_stock and variants/out_of_stock).
  • You can add multiple vendors to the list.
This setting overrides all other inventory-based availability logic for the specified vendors. Products from always-available vendors remain visible even when their inventory quantity is zero and their inventory policy is set to deny overselling.
To configure always-available vendors, contact the support team with the list of vendor names you want to mark as always available.

Online-fulfilling locations feature

For stores with multiple inventory locations (such as retail stores and warehouses), you can enable an opt-in feature. This recalculates variant availability based only on locations where fulfills_online_orders = true. This ensures that variants are only marked as available if they have stock at locations that can fulfill online orders.
This feature depends on the per-variant, per-location inventory sync being enabled. On multi-location stores it is enabled automatically, but you can force it on or off from the Merchandising settings page.

How availability is calculated

When the online-fulfilling locations feature is enabled, a variant is considered available if:
  1. The variant has inventory_policy = 'continue' (allows selling when out of stock), OR
  2. The variant has available quantity > 0 at any active location where fulfills_online_orders = true

When availability is recalculated

Variant availability is automatically recalculated in the following scenarios:
  • After bulk inventory syncs complete
  • When inventory levels are updated via webhooks
  • When a location’s fulfills_online_orders or is_active status changes
  • When the feature is first enabled for your store
After recalculation, affected products are automatically updated in the search index to reflect the new availability status.

Location-based inventory tracking

Layers tracks which inventory locations have available stock for each variant through the variants.in_stock_location_ids field. This field contains an array of location IDs where the variant has available > 0 inventory, enabling you to use location-specific availability in sort orders for product demotion.
The in_stock_location_ids field is sortable but not filterable, and is not included in API responses. It is an internal field used exclusively for sorting operations such as demoting products that are out of stock at specific locations.
The in_stock_location_ids field is automatically updated whenever:
  • Inventory levels change via webhooks or bulk syncs
  • A variant’s inventory is adjusted at any location
  • New inventory locations are added or modified
You can use this field in sort orders to demote products that are not in stock at specific locations. See the Sorting documentation for details on configuring sort orders with priority rules.

Enabling the feature

To enable online-fulfilling location availability calculation, contact the support team. The feature will take effect after the next inventory sync completes.

Synchronization process

Upon receiving a webhook notification, Layers performs the following steps:
  1. Verification: Confirms the validity of the webhook event.
  2. Data fetch: Retrieves the latest information on the affected products.
  3. Index update: Updates the search index to reflect the new or changed data.

Collection deletion protection

When Shopify updates the products in a smart or custom collection, the sync may detect that a large number of products need to be removed. This can happen due to changes in smart collection rules, accidental bulk edits, or temporary Shopify data issues. Collection deletion protection prevents these bulk removals from taking effect immediately, giving you a chance to review and approve or deny them before products disappear from your storefront.

How it works

During each collection sync, Layers compares the incoming product list from Shopify against the products currently indexed for that collection. If collection deletion protection is enabled for the store, the number of products to remove exceeds the store’s configured deletion threshold, and the collection has received traffic in the last 24 hours, Layers blocks the deletion and creates a protection event instead of removing the products. If collection deletion protection is disabled (the default), collection syncs proceed normally — products are removed as Shopify reports them, even when the deletion percentage is large. The deletion threshold and minimum count settings have no effect until protection is turned on. When a deletion is blocked:
  1. A protection event is created with details about the collection, the number of products affected, and the deletion percentage.
  2. All store team members receive a dashboard notification prompting them to review the blocked deletion.
  3. The products remain in the collection and continue to appear in browse results until the event is resolved.
  4. If no action is taken, the deletion is automatically approved after a configurable number of days (default: 7).

Reviewing protection events

Blocked deletions appear as warning indicators next to the affected collection on the Collections page. You can approve or deny each event directly from the collection’s action menu.
  • Approve: Removes the flagged products from the collection and clears the browse cache for that collection.
  • Deny: Keeps all products in the collection. The products remain indexed until the next sync re-evaluates membership.

Enabling the feature

Collection deletion protection is disabled by default. To enable it:
  1. Go to SettingsShopify Sync in the Layers dashboard.
  2. Check Require approval before sync removes large batches of products from collections.
  3. Optionally adjust the Auto-approve after (days) value to control how long blocked deletions wait before being automatically approved. The default is 7 days.
  4. Save your changes.
Collection deletion protection only applies when the setting is enabled and the collection has received browse traffic in the last 24 hours. Collections with no recent traffic — and all collections on stores where the setting is disabled — are synced normally, since bulk removals in unused collections are unlikely to affect customers.

Auto-approval

If a blocked deletion is not manually approved or denied within the configured auto-approve window, Layers automatically approves it. This ensures that legitimate Shopify collection changes are not blocked indefinitely. When auto-approval occurs, the affected products are removed and the browse cache is refreshed — the same outcome as a manual approval.

Troubleshooting sync issues

If you encounter issues with catalog synchronization, consider the following steps:
  • Check Webhook Settings: Ensure that Layers has the correct permissions.
  • Review Product Status: Verify that products are active and published to the correct storefront.

App uninstallation and data retention

When you uninstall the Layers app from your Shopify store, your data is not deleted immediately. Instead, Layers keeps your store data for a 30-day grace period to allow for accidental uninstallations or changes of mind.

What happens during the grace period

  1. Your data is retained temporarily: Your store and associated data remain intact during the grace period.
  2. Sync activity stops: Layers no longer continues normal sync activity for the uninstalled store.
  3. The Layers team is notified: This helps support restoration requests during the grace period.

Restoring access after uninstallation

If you uninstalled the app by mistake or changed your mind:
  1. Reinstall the Layers app from the Shopify App Store within the 30-day grace period.
  2. Contact the support team to restore your store and data.
  3. Your previous configuration and data will be preserved and reactivated.

Permanent deletion

After 30 days, your store and all associated data will be permanently deleted. This includes:
  • Product catalog data
  • Search analytics and metrics
  • Configuration settings
  • All historical data
If you have any questions about uninstalling or need assistance, please contact the support team before the 30-day period expires.

Catalog scale and limits

Layers has no hard limits on the number of products, variants, or SKUs that can be synced and indexed. The platform is designed to scale with your business and has successfully handled catalogs with millions of SKUs.

What this means for your store

  • No product limits: Sync your entire catalog regardless of size
  • No variant limits: Products with hundreds or thousands of variants are fully supported
  • No SKU limits: The system scales to accommodate catalogs with millions of unique SKUs
  • Proven at scale: Layers has been tested and validated with large enterprise catalogs
If you have questions about catalog size or performance for your specific use case, please contact support.

FAQs

Q: How often does catalog sync occur?
A: Synchronization happens in near real-time following the triggering of any subscribed webhook events. Additionally, every eight hours, the entire catalog is bulk exported from Shopify.
Q: Can I manually trigger a catalog sync? A: Yes, you can initiate a manual sync via the Layers dashboard if needed. Q: Does the catalog sync work with split products or Combined Listings? A: Yes, all published products are synced from Shopify. Q: How can I hide a product from Layers?
A: You can unpublish it from the Online Store sales channel, add the hide tag, or configure custom excluded tags in Settings → Search Behavior. By default, products with the hide, or layers-ignore tags are excluded from search.
For more information or if you need assistance, please contact support.