> ## Documentation Index
> Fetch the complete documentation index at: https://docs.uselayers.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Third-party integrations

> Enable loyalty, analytics, and personalization integrations for Layers like Rivo, Smile.io, LoyaltyLion, Blotout, and Microsoft Clarity from the dashboard.

## Overview

Layers integrates with popular analytics, personalization, and promotional tools to enhance your search and discovery experience. All integrations are configured through the Layers dashboard, making it easy to enable and manage connections without modifying your theme code.

The integration system is designed to be:

* **Privacy-compliant**: All integrations respect the same consent settings as the Layers Pixel
* **Non-intrusive**: Integrations only use services already loaded on the page
* **Dashboard-managed**: Enable or disable integrations with a single toggle
* **Extensible**: New integrations are added regularly based on merchant needs

## Configuring integrations

To manage your integrations:

1. Go to the **Settings** page in the Layers dashboard
2. Select the **Integrations** tab
3. Toggle integrations on or off as needed
4. Select **Save changes**

Changes take effect immediately and are synced to your storefront.

<Note>
  Disabling an integration also removes the data it added to your Layers catalog. Attributes an integration synced (for example, review ratings from Reviews.io or PowerReviews) are deleted along with their stored values, and affected products are re-indexed so the attributes no longer appear in search, filtering, or merchandising. Attributes shared with another integration that is still enabled are kept. Re-enabling the integration syncs the data again.
</Note>

<Note>
  A few integrations, such as [Kairos](#kairos) and [Fish Wishlist](#fish-wishlist), are detected automatically and have no toggle. Once the app is installed on your store, Layers recognizes it and adjusts on its own.
</Note>

## Supported integrations

### Rivo

[Rivo](https://rivo.io/?utm_source=docs.uselayers.com\&utm_medium=referral\&utm_campaign=integrations) is a loyalty and rewards platform for Shopify merchants. When enabled, Layers receives richer customer profile context from Rivo, enabling enhanced personalization in search results based on loyalty tier, points balance, and reward eligibility.

**Benefits:**

* Personalize search results based on customer loyalty status
* Surface products relevant to available rewards
* Enhance customer segmentation with loyalty data

### Smile.io

[Smile.io](https://smile.io/?utm_source=docs.uselayers.com\&utm_medium=referral\&utm_campaign=integrations) is a loyalty and rewards platform for Shopify. When enabled, Layers receives Smile.io loyalty context (such as VIP tier) so merchandising rules and ranking signals can factor in each shopper's loyalty status.

**Benefits:**

* Personalize search results by VIP tier and loyalty standing
* Surface rewards-eligible products to engaged shoppers
* Combine loyalty context with other session signals for richer targeting

The enabled flag flows through to the Layers Pixel on your storefront, so no theme code changes are needed. Toggle **Smile.io** on in **Settings → Integrations** to enable it.

### LoyaltyLion

[LoyaltyLion](https://loyaltylion.com/?utm_source=docs.uselayers.com\&utm_medium=referral\&utm_campaign=integrations) is a customer loyalty and engagement platform for Shopify. When enabled, Layers receives LoyaltyLion points balance and tier context, enabling personalization based on each shopper's loyalty standing.

**Benefits:**

* Personalize search results using points balance and loyalty tier
* Target merchandising at high-tier shoppers or points-eligible customers
* Enrich session context with loyalty signals alongside cart, location, and history

Toggle **LoyaltyLion** on in **Settings → Integrations** to enable it. No storefront code changes are required.

### Blotout

[Blotout](https://blotout.io/?utm_source=docs.uselayers.com\&utm_medium=referral\&utm_campaign=integrations) is a privacy-first customer data platform that helps you collect, unify, and activate customer data without relying on third-party cookies.

When enabled, Layers forwards widget clickstream events to Blotout and uses Blotout's User and Device IDs for consistent cross-session tracking.

**Benefits:**

* Unified customer identity across touchpoints
* Privacy-compliant event tracking
* Enhanced attribution for visual search interactions

### Microsoft Clarity

[Microsoft Clarity](https://clarity.microsoft.com/?utm_source=docs.uselayers.com\&utm_medium=referral\&utm_campaign=integrations) is a free analytics tool that provides session recordings, heatmaps, and behavioral insights to help you understand how customers interact with your website.

When enabled, Layers streams widget click data to Clarity, allowing you to replay sessions involving visual search and shop similar interactions to identify UX friction points.

**Benefits:**

* Session recordings of visual search usage
* Heatmaps showing widget interaction patterns
* Behavioral insights for search optimization

### Abra Promotions

[Abra Promotions](https://abrapromotions.com/?utm_source=docs.uselayers.com\&utm_medium=referral\&utm_campaign=integrations) is a promotional pricing platform that enables dynamic discounts and flash sales on Shopify.

When enabled, Layers natively integrates with Abra's discount engine, ensuring that price-based sorting and filtering accurately reflect promotional pricing. This integration is essential for merchants using Abra to run sales and promotions.

**Benefits:**

* Accurate price sorting with active promotions
* Correct price filtering during sales
* Consistent pricing across search and collection pages

For detailed information on using discount entitlements with the Layers API, see [Discount entitlements](/shopify-integration/discount-entitlements).

### FoxSell Bundles

[FoxSell Bundles](https://foxsell.app/?utm_source=docs.uselayers.com\&utm_medium=referral\&utm_campaign=integrations) is a product bundling app for Shopify that lets you create fixed bundles, mix-and-match bundles, cross-sell offers, multi-variant bundles, and volume discounts.

When enabled, Layers computes accurate prices for FoxSell bundle products so they appear correctly in price-based sorting, filtering, and search results. Without this integration, bundle products may display incorrect prices because Shopify stores them differently than standard products.

**Benefits:**

* Accurate price sorting and filtering for all bundle types
* Correct price display in search and collection results
* Improved search relevance through bundle component awareness. Layers indexes the titles of products included in a bundle, so searches for component products can surface relevant bundles

**How it works:**

When this integration is enabled, Layers automatically:

1. Reads the FoxSell metafields on your products and variants to determine bundle configuration
2. Computes the true bundle price by resolving component product prices
3. Overrides the indexed price range so sorting and filtering reflect the actual bundle price
4. Includes component product titles in the search index for better discoverability

**Supported bundle types:**

Each bundle type is priced differently based on how FoxSell structures its components:

* **Fixed bundles** — the price is calculated by summing each component product's price multiplied by its quantity. The resulting price range reflects the cheapest and most expensive possible combinations.
* **Mix-and-match bundles** — supports two pricing models. With **fixed pricing**, a flat price is applied based on the selected tier. With **dynamic pricing**, the price is computed by summing the individual prices of the selected component products.
* **Cross-sell bundles** — the total price is computed from the component products, and any configured percentage discount is applied. The original undiscounted total is preserved as a compare-at price so shoppers can see the savings.
* **Multi-variant bundles** — Layers evaluates each parent variant's bundled component variants to determine a minimum and maximum price across all configurations.
* **Volume discount bundles** — Shopify already stores the correct base price for volume bundles, so no price override is applied. The integration still indexes component product titles for search discoverability.

<Note>
  When you enable the FoxSell Bundles integration, Layers automatically adds the required FoxSell metafield namespaces to your store's metafield sync configuration. No manual metafield setup is needed.
</Note>

<Note>
  After enabling the integration, trigger a [catalog resync](/help/catalog/resync-catalog) to recompute bundle prices across your catalog. New and updated products are priced automatically going forward.
</Note>

### Edgemesh

[Edgemesh](https://edgemesh.com/?utm_source=docs.uselayers.com\&utm_medium=referral\&utm_campaign=integrations) is a client-side performance optimization platform that accelerates page load times through intelligent prefetching, predictive preloading, and edge-based caching. When enabled, Layers syncs integration status to your storefront so that Edgemesh-aware components can coordinate prefetching behavior with Layers API responses.

**Benefits:**

* Coordinate image prefetching with Layers search and browse responses
* Leverage Edgemesh's predictive engine alongside Layers' Link header preload hints
* Unified performance optimization across search, browse, and product pages
* Improved purchase attribution through Edgemesh session tracking. Layers reads `_em_session_id` from order note attributes to link purchases back to browsing sessions (see [Order Attributes](/shopify-integration/storefront-pixel#order-attributes))

### Kairos

[Kairos](https://www.kairosprotect.com/?utm_source=docs.uselayers.com\&utm_medium=referral\&utm_campaign=integrations) is a bot and fraud protection app for Shopify. It verifies every visitor with invisible challenges before their first pageview. Kairos blocks scrapers, crawlers, and card testers before Shopify, your ad platforms, or Layers ever count them. Real shoppers notice nothing.

Layers detects Kairos on your store automatically. There is no toggle to turn on and no theme changes to make.

**Benefits:**

* Sessions Kairos blocks never load your storefront, so they never send events to Layers
* Search and browse analytics reflect verified human sessions only
* Conversion rates, click-through rates, and merchandising signals are not inflated by bot noise
* Nothing to configure. Install Kairos and the two work together from there

<Note>
  Kairos is installed and billed through the [Shopify App Store](https://apps.shopify.com/kairos). Layers only detects that it is protecting your storefront and does not exchange shopper data with it. Layers requests come from sessions Kairos has already verified, so search and browse behave exactly as before.
</Note>

### Okendo

[Okendo](https://www.okendo.io/?utm_source=docs.uselayers.com\&utm_medium=referral\&utm_campaign=integrations) is a customer marketing platform for Shopify that includes product reviews, surveys, referrals, and quizzes. The Layers integration focuses on Okendo's quiz feature, bringing shopper quiz responses into Layers so you can personalize search and collection results based on each customer's stated preferences.

When a shopper completes an Okendo quiz, the responses are sent to Layers via webhook and stored against the shopper's session. On every subsequent search or browse request, Layers automatically enriches the session context with the shopper's quiz profile, allowing merchandising rules and ranking signals to factor in their preferences.

**Benefits:**

* Personalize search and collection results using quiz-derived preferences
* Surface products that match a shopper's stated needs (e.g., skin type, style preferences, fitness goals)
* Combine quiz context with other signals like cart contents, purchase history, and location for richer personalization
* No theme code changes required. Quiz data flows into Layers automatically once the integration is enabled

**How it works:**

1. Enable the Okendo integration in the Layers dashboard under **Settings → Integrations**
2. Copy the webhook endpoint shown in the setup panel
3. In your Okendo dashboard, register the webhook endpoint and copy the signing secret
4. Paste the signing secret into the **Webhook Secret** field in Layers and save
5. When a shopper completes a quiz, Okendo sends the response to Layers via webhook
6. Layers normalizes the quiz answers and attaches them to the shopper's session
7. All subsequent search and browse requests for that session automatically include the quiz profile as part of the [contextual information](/engine/contextual-information)

**Configuration:**

| Field | Description |
| :- | :- |
| **Webhook Secret** | The signing secret from Okendo used to verify incoming webhook payloads. Found in your Okendo webhook settings. Starts with `whsec_`. |

**Supported webhook topics:**

The integration listens for the following Okendo quiz response events:

* **quiz\_response.create** — a shopper submits a new quiz response
* **quiz\_response.update** — a shopper updates an existing quiz response
* **quiz\_response.delete** — a quiz response is removed

<Note>
  Quiz responses are matched to shoppers using the session ID (subscriber ID in Okendo). This means personalization takes effect within the same browsing session in which the shopper completed the quiz.
</Note>

### Yotpo

[Yotpo](https://www.yotpo.com/?utm_source=docs.uselayers.com\&utm_medium=referral\&utm_campaign=integrations) is a customer marketing platform that includes product reviews and ratings for Shopify merchants. When enabled, Layers syncs Yotpo's review rating and count metafields from your Shopify products so you can sort, filter, and merchandise on social proof.

**Benefits:**

* Sort collection and search results by average review rating or review count
* Build merchandising rules that boost highly-rated products or products with a minimum number of reviews
* Filter products by star rating without any additional catalog setup
* No storefront code changes required. Yotpo already writes review data to Shopify metafields, and Layers picks them up automatically

**How it works:**

When this integration is enabled, Layers automatically:

1. Adds the Yotpo review metafield namespace to your store's metafield sync configuration
2. Reads the review metafields that Yotpo writes to each product in Shopify
3. Exposes them as first-class product attributes you can reference in sort orders, merchandising rules, and search filters

**Synced attributes:**

| Attribute | Description |
| :- | :- |
| **Review rating** | The average review rating for the product, as a decimal (for example, `4.7`). Sortable and filterable as a numeric value. |
| **Review count** | The total number of reviews for the product, as an integer. Sortable and filterable as a numeric value. |

**Dashboard panel:**

After enabling the integration, the **Yotpo review metafields** panel in **Settings → Integrations** shows how many products have each review attribute populated. Select **Resync reviews** to queue a fresh sync if you just installed Yotpo or if review data looks out of date.

<Note>
  Enabling Yotpo automatically adds its review metafield namespace to your store's metafield sync configuration. Disabling the integration removes those attributes from your Layers catalog.
</Note>

<Note>
  After enabling the integration, trigger a [catalog resync](/help/catalog/resync-catalog) or use the **Resync reviews** button in the integration panel so review attributes are populated across your catalog. New and updated products are synced automatically going forward.
</Note>

### Judge.me

[Judge.me](https://judge.me/?utm_source=docs.uselayers.com\&utm_medium=referral\&utm_campaign=integrations) is a product reviews app for Shopify. When enabled, Layers reads the standard Shopify review metafields that Judge.me writes to your products, so you can sort, filter, and merchandise on review count and rating.

**Benefits:**

* Sort collection and search results by review count
* Build merchandising rules that boost products with strong social proof
* Filter products by review count without extra catalog setup
* No storefront code changes required. Judge.me already writes review data to Shopify's standard `reviews.*` metafields, and Layers picks them up automatically

**Synced attributes:**

| Attribute | Description |
| :- | :- |
| **Review rating** | The average review rating for the product, from Shopify's `reviews.rating` metafield. |
| **Review count** | The total number of reviews for the product, from Shopify's `reviews.rating_count` metafield. |

**Dashboard panel:**

After enabling the integration, the **Judge.me review metafields** panel in **Settings → Integrations** shows how many products have each review attribute populated. Select **Resync reviews** to queue a fresh sync if you just installed Judge.me or if review data looks out of date.

<Note>
  Judge.me's review count is sortable and filterable today. Sorting by average rating is not yet supported for Judge.me because Shopify stores `reviews.rating` as a JSON object rather than a plain number.
</Note>

<Note>
  After enabling the integration, trigger a [catalog resync](/help/catalog/resync-catalog) or use the **Resync reviews** button in the integration panel so review attributes are populated across your catalog.
</Note>

### Fera

[Fera](https://www.fera.ai/?utm_source=docs.uselayers.com\&utm_medium=referral\&utm_campaign=integrations) is a reviews and social proof app for Shopify. When enabled, Layers reads the standard Shopify review metafields that Fera writes to your products, so you can sort, filter, and merchandise on review count and rating.

**Benefits:**

* Sort collection and search results by review count
* Build merchandising rules that boost highly-reviewed products
* Filter products by review count without extra catalog setup
* No storefront code changes required. Fera writes review data to Shopify's standard `reviews.*` metafields, and Layers picks them up automatically

**Synced attributes:**

| Attribute | Description |
| :- | :- |
| **Review rating** | The average review rating for the product, from Shopify's `reviews.rating` metafield. |
| **Review count** | The total number of reviews for the product, from Shopify's `reviews.rating_count` metafield. |

**Dashboard panel:**

After enabling the integration, the **Fera review metafields** panel in **Settings → Integrations** shows how many products have each review attribute populated. Select **Resync reviews** to queue a fresh sync.

<Note>
  Stores that installed Fera before March 2022 must enable **Shopify standard metafield sync** inside Fera before review data appears in Shopify metafields. Newer Fera installations sync by default.
</Note>

<Note>
  Fera's review count is sortable and filterable today. Sorting by average rating is not yet supported because Shopify stores `reviews.rating` as a JSON object rather than a plain number.
</Note>

### Junip

[Junip](https://junip.co/?utm_source=docs.uselayers.com\&utm_medium=referral\&utm_campaign=integrations) is a product reviews platform for Shopify. When enabled, Layers reads Junip's review metafields (both Junip's own `junip.*` keys and the standard Shopify `reviews.*` keys) so you can sort, filter, and merchandise on ratings and review counts.

**Benefits:**

* Sort collection and search results by average review rating or review count
* Build merchandising rules that boost highly-rated products
* Filter products by star rating or review count without extra catalog setup
* No storefront code changes required. Junip writes review data to Shopify metafields, and Layers picks them up automatically

**Synced attributes:**

| Attribute | Description |
| :- | :- |
| **Review rating** | The average review rating for the product, from Junip's `junip.rating_average` metafield. Sortable and filterable as a numeric value. |
| **Review count** | The total number of reviews for the product, from Junip's `junip.rating_count` metafield. Sortable and filterable as a numeric value. |
| **Review rating (Shopify standard)** | The average rating from Shopify's `reviews.rating` metafield. |
| **Review count (Shopify standard)** | The total review count from Shopify's `reviews.rating_count` metafield. |

**Dashboard panel:**

After enabling the integration, the **Junip review metafields** panel in **Settings → Integrations** shows how many products have each review attribute populated. Select **Resync reviews** to queue a fresh sync.

<Note>
  Junip's `junip.rating_average` is sortable numerically. The Shopify-standard `reviews.rating` attribute is not yet sortable because Shopify stores it as a JSON object.
</Note>

### Reviews.io

[Reviews.io](https://www.reviews.io/?utm_source=docs.uselayers.com\&utm_medium=referral\&utm_campaign=integrations) is a customer review platform for Shopify. Unlike other review apps that store ratings in Shopify metafields, Reviews.io keeps rating data in its own API. When enabled, Layers pulls per-SKU rating aggregates directly from Reviews.io and exposes them as first-class product attributes, so you can sort, filter, and merchandise on social proof.

**Benefits:**

* Sort collection and search results by average review rating or review count
* Build merchandising rules that boost highly-rated products or products with a minimum number of reviews
* Filter products by star rating without any additional catalog setup
* Ratings stay current automatically. Reviews.io webhooks push new review events to Layers so aggregates update as reviews come in

**How it works:**

1. Enable the Reviews.io integration in the Layers dashboard under **Settings → Integrations**
2. Enter your Reviews.io **Store ID** and **API key** and save
3. Layers fetches per-SKU rating aggregates from Reviews.io in batches and stores them against each product and variant
4. Layers registers a webhook with Reviews.io so new and updated reviews refresh the affected SKUs automatically
5. Ratings become available as product attributes you can reference in sort orders, merchandising rules, and search filters

**Configuration:**

| Field | Description |
| :- | :- |
| **Store ID** | Your Reviews.io store identifier. Found in your Reviews.io account settings. |
| **API key** | The API key used to authenticate requests to the Reviews.io API. Found under your Reviews.io API credentials. |

**Synced attributes:**

| Attribute | Grain | Description |
| :- | :- | :- |
| **Review rating** | Product | The average review rating across all SKUs on the product, as a decimal (for example, `4.7`). Sortable and filterable as a numeric value. |
| **Review count** | Product | The total number of reviews across all SKUs on the product. Sortable and filterable as an integer. |
| **Variant review rating** | Variant | The average review rating for an individual variant SKU. |
| **Variant review count** | Variant | The total number of reviews for an individual variant SKU. |

**Dashboard panel:**

After enabling the integration, the **Reviews.io ratings** panel in **Settings → Integrations** shows how many products have rating data populated, the last sync time, and any SKUs Reviews.io could not match. Select **Resync ratings** to queue a fresh sync if you just installed Reviews.io or if rating data looks out of date.

<Note>
  Reviews.io stores ratings per SKU, not per metafield. You do not need to add any Reviews.io metafields to your Shopify store or enable metafield sync for this integration to work.
</Note>

<Note>
  After enabling the integration, trigger a [catalog resync](/help/catalog/resync-catalog) or use the **Resync ratings** button in the integration panel so review attributes populate across your catalog. Ongoing updates arrive automatically via webhook.
</Note>

### PowerReviews

[PowerReviews](https://www.powerreviews.com/?utm_source=docs.uselayers.com\&utm_medium=referral\&utm_campaign=integrations) is a customer review and UGC platform. Like Reviews.io, PowerReviews keeps rating data in its own API rather than Shopify metafields. When enabled, Layers pulls rating snippets from the PowerReviews Display API and exposes them as first-class product attributes, so you can sort, filter, and merchandise on social proof.

**Benefits:**

* Sort collection and search results by average review rating or review count
* Build merchandising rules that boost highly-rated products or products with a minimum number of reviews
* Filter products by star rating without any additional catalog setup
* Ratings refresh on a daily cadence, matching PowerReviews' own 24-hour snippet cache

**How it works:**

1. Enable the PowerReviews integration in the Layers dashboard under **Settings → Integrations**
2. Enter your **Merchant ID** and **API key**, and pick the **Page ID attribute** that holds the identifier PowerReviews knows each product by
3. Layers fetches a rating snippet per product from the PowerReviews Display API and stores the rating and review count against each product (and variant, when a variant Page ID attribute is configured)
4. A nightly sync keeps ratings current; each product is fetched as its own job so one slow product never holds up the rest
5. Ratings become available as product attributes you can reference in sort orders, merchandising rules, and search filters

**Configuration:**

| Field | Description |
| :- | :- |
| **Merchant ID** | Your PowerReviews merchant identifier. Found in your PowerReviews account. |
| **API key** | The read API key used to authenticate requests to the PowerReviews Display API. |
| **Locale** | The PowerReviews locale your reviews are filed under. Defaults to `en_US`. |
| **Page ID attribute** | The product attribute holding the Page ID PowerReviews knows each product by. Required. |
| **Variant Page ID attribute** | Optional variant-level attribute holding Page IDs, when reviews are keyed to variants. |

**Synced attributes:**

| Attribute | Grain | Description |
| :- | :- | :- |
| **Review rating** | Product | The average review rating for the product, as a decimal (for example, `4.7`). Sortable and filterable as a numeric value. |
| **Review count** | Product | The total number of reviews for the product. Sortable and filterable as an integer. |
| **Variant review rating** | Variant | The average review rating for an individual variant. |
| **Variant review count** | Variant | The total number of reviews for an individual variant. |

<Note>
  PowerReviews keys ratings to a Page ID, not a SKU or metafield. Pick the catalog attribute that stores the same identifier your storefront sends PowerReviews, or ratings won't match your products.
</Note>

### Swym Wishlist Plus

[Swym Wishlist Plus](https://swym.it/wishlist-plus/?utm_source=docs.uselayers.com\&utm_medium=referral\&utm_campaign=integrations) is a wishlist app for Shopify. When enabled, Layers syncs the total wishlist count per product from Swym's `swym_wishlist.wishlist_social_count` metafield, so you can merchandise by shopper demand.

**Benefits:**

* Sort collection and search results by wishlist count to surface trending products
* Build merchandising rules that boost products with strong wishlist demand
* Filter products by wishlist count without extra catalog setup
* No storefront code changes required. Swym already writes wishlist counts to a Shopify metafield, and Layers picks them up automatically

**Synced attributes:**

| Attribute | Description |
| :- | :- |
| **Wishlist count** | The number of shoppers who have added the product to a wishlist, from `swym_wishlist.wishlist_social_count`. Sortable and filterable as an integer. |

**Dashboard panel:**

After enabling the integration, the **Swym wishlist metafields** panel in **Settings → Integrations** shows how many products have wishlist counts populated. Select **Resync wishlist counts** to queue a fresh sync.

<Note>
  After enabling the integration, trigger a [catalog resync](/help/catalog/resync-catalog) or use the **Resync wishlist counts** button in the integration panel so wishlist counts populate across your catalog.
</Note>

### Fish Wishlist

Fish Wishlist is a wishlist app for Shopify. Layers detects it on your store automatically, so there is no toggle to turn on and no theme changes to make.

Wishlist events feed directly into Layers user profiles and affinities. Every time a shopper adds or removes an item, Layers updates that shopper's profile, strengthening the affinity signals used for personalization, ranking, and merchandising rules.

**Benefits:**

* Personalize search and collection results using each shopper's saved items
* Strengthen shopper affinities automatically as wishlists change
* Combine wishlist affinity with other session signals for richer targeting
* Nothing to configure. Install Fish Wishlist and wishlist events start feeding shopper profiles right away

<Note>
  Alongside per-shopper affinity events, the total wishlist count per product stays available as an aggregate demand signal for sorting, filtering, and rules.
</Note>

### Stockful

[Stockful](https://stockful.com/?utm_source=docs.uselayers.com\&utm_medium=referral\&utm_campaign=integrations) is an inventory intelligence app for Shopify that tracks stock status, sales velocity, and projected stockouts. When enabled, Layers syncs the inventory metafields that Stockful writes to your products and variants, so you can merchandise and sort on live inventory signals.

**Benefits:**

* Sort collection and search results by sales velocity or units sold
* Build merchandising rules that demote low-stock or out-of-stock products before they disappoint shoppers
* Push products approaching a projected stockout up or down without manual curation
* No storefront code changes required. Stockful writes inventory data to Shopify metafields, and Layers picks them up automatically

**Synced attributes:**

| Attribute | Grain | Description |
| :- | :- | :- |
| **Stock status** | Product | The product's overall stock status (for example, in stock or low stock). |
| **Low-stock variants** | Product | The number of variants on the product that are low on stock, as an integer. |
| **Velocity trend** | Product | The product's sales velocity trend. |
| **Units sold (30d)** | Product | Units sold across the product in the last 30 days, as an integer. |
| **Stock status (variant)** | Variant | The individual variant's stock status. |
| **Days of supply** | Variant | Estimated days of inventory remaining for the variant, as an integer. |
| **Velocity trend (variant)** | Variant | The variant's sales velocity trend. |
| **Projected stockout** | Variant | The variant's projected stockout date in ISO 8601 format. Sorts in date order. |
| **ABC class** | Variant | The variant's ABC inventory classification. |
| **Restock status** | Variant | The variant's restock status. |
| **Units sold (30d, variant)** | Variant | Units sold for the variant in the last 30 days, as an integer. |

**Dashboard panel:**

After enabling the integration, the **Stockful inventory metafields** panel in **Settings → Integrations** shows how many products have inventory data populated. Select **Resync inventory data** to queue a fresh sync if you just installed Stockful or if inventory data looks out of date.

<Note>
  Stockful attributes are available in merchandising rules, conditions, and sort orders, but cannot be enabled as storefront facets. Stockful rewrites these values on every inventory movement, so they change too frequently for facet counts to stay accurate. The **Enable as Storefront Facet** option is unavailable for these attributes.
</Note>

<Note>
  After enabling the integration, trigger a [catalog resync](/help/catalog/resync-catalog) or use the **Resync inventory data** button in the integration panel so inventory attributes populate across your catalog. New and updated products are synced automatically going forward.
</Note>

### Moast

[Moast](https://www.moast.io/?utm_source=docs.uselayers.com\&utm_medium=referral\&utm_campaign=integrations) is a shoppable video app for Shopify. When enabled, Layers adds a **Moast Widget** [banner type](/platform/merchandising/banner-types) so merchandising rules can drop a Moast widget into a collection grid alongside product cards. The browse response ships the embed markup your storefront needs to render the widget.

**Benefits:**

* Place Moast carousels, stories, and other widget types as merchandising banners
* Target and schedule Moast banners with the same contextual conditions and schedules as any other banner
* No new storefront plumbing. Layers ships the exact `<moast-…>` custom element markup Moast documents

**How it works:**

1. Toggle **Moast** on in **Settings → Integrations** and select **Save changes**. Layers seeds a system banner type with slug `moast` on your store.
2. Open a merchandising rule and add a banner. Select **Moast Widget** as the banner type.
3. In the banner's data fields, select a widget from the **Moast widget** dropdown. Widgets scoped to a product or collection in Moast are labeled as such. Moast resolves them on the page they render on.
4. Set the banner's **Web Media** and **Mobile Media** (banners still require both), select a placement, and save the rule.
5. On matching browse requests, the banner's `data.widget` field carries the resolved embed payload. Your storefront reads the payload and drops the markup into the DOM.

**Widget payload:**

Every Moast widget field on a banner resolves to an object like this on the [browse response](/api-reference/browse):

```json theme={null}
{
  "ref": "featured-carousel",
  "name": "Featured carousel",
  "type": "carousel",
  "placement": "global",
  "requires_product": false,
  "requires_collection": false,
  "tag_name": "moast-carousel",
  "script_src": "/apps/moast/embed/carousel.js",
  "payload_url": "/apps/moast/api/example.myshopify.com/widget/featured-carousel",
  "html": "<script src=\"/apps/moast/embed/carousel.js\" async type=\"module\"></script>\n<moast-carousel widget=\"featured-carousel\" shop=\"example.myshopify.com\"></moast-carousel>"
}
```

The simplest renderer inserts `html` verbatim. If you prefer to build the element yourself, use `tag_name`, `script_src`, and `ref` and mount the custom element with the widget's `ref` on its `widget` attribute.

<Note>
  If a banner's stored widget reference no longer resolves (the widget was deleted in Moast, or the integration is disabled), the `data.widget` field is set to `null`. Guard for this in your renderer.
</Note>

<Note>
  Widgets that Moast marks as `product`- or `collection`-scoped only render on the corresponding page. Use them in rules that only match on product or collection surfaces.
</Note>

<Note>
  Disabling the Moast integration nulls out `data.widget` on every Moast banner on the next request, so widgets stop rendering immediately. The **Moast Widget** banner type stays on the store so you can re-enable the integration without losing banner configuration.
</Note>

<Note>
  If a custom banner type on your store already uses the slug `moast`, enabling the integration fails with a validation error. Rename the existing type before turning Moast on.
</Note>

### Klaviyo

[Klaviyo](https://www.klaviyo.com/?utm_source=docs.uselayers.com\&utm_medium=referral\&utm_campaign=integrations) is a marketing platform for email, SMS, and push campaigns. The Layers integration lets you target merchandising rules, banners, blocks, product sequences, search, and sort orders at shoppers who arrive from a specific Klaviyo campaign, instead of pasting UTM strings by hand.

Once connected, Layers syncs your Klaviyo campaigns and their tracking UTMs on a nightly schedule and adds a **Campaign** field under the **Klaviyo** group in the [contextual conditions](/platform/merchandising/contextual-conditions) field picker. Selecting a campaign from the picker matches any shopper whose session UTMs (`utm_source`, `utm_medium`, `utm_campaign`) came from that campaign, across email, SMS, and push channels.

**Benefits:**

* Target merchandising at shoppers arriving from a specific campaign without copying UTMs by hand
* Consistent campaign targeting across every contextual surface (rules, banners, blocks, sequences, search, sort orders)
* Automatic nightly sync keeps the campaign list current as you launch new sends
* Resolves Klaviyo's dynamic campaign-name UTM placeholders to the literal values that actually reach the storefront

**How it works:**

1. Go to **Settings → Integrations** in the Layers dashboard
2. Toggle **Klaviyo** on. A dialog opens with a **Continue to Klaviyo** button
3. Approve the requested read-only access to campaigns and account info in Klaviyo
4. Klaviyo redirects back to Layers and the initial campaign sync starts automatically
5. Open any surface that supports contextual conditions (for example, a merchandising rule) and select **Campaign** from the **Klaviyo** group in the condition field picker
6. Select a campaign from the searchable dropdown. The condition matches when the shopper's session UTMs match that campaign's source, medium, and campaign values

**Supported operators:**

The Klaviyo **Campaign** field supports two operators:

* **equals** — the rule matches only when the shopper arrived from the selected campaign
* **does not equal** — the rule matches every shopper *except* those who arrived from the selected campaign

**Which campaigns appear in the picker:**

The picker lists campaigns that have all three tracking UTMs (`utm_source`, `utm_medium`, `utm_campaign`) configured in Klaviyo. Campaigns without tracking UTMs are skipped because they cannot be uniquely matched by the shopper's session.

<Note>
  Campaign matching is case-insensitive and evaluated entirely from the shopper's session UTMs. There is no request-time call to Klaviyo, so campaign conditions do not add latency to search or browse requests.
</Note>

<Note>
  Newly launched campaigns appear in the picker after the next nightly sync. Disconnect and reconnect the integration to force an immediate resync.
</Note>

**Disconnecting:**

Toggle **Klaviyo** off in **Settings → Integrations** to disconnect. Layers revokes its OAuth grant with Klaviyo and clears the synced campaign list. Any existing merchandising rules that reference a Klaviyo campaign continue to evaluate against the stored UTM values, but the picker will no longer be available until you reconnect.

### Listrak

[Listrak](https://www.listrak.com/?utm_source=docs.uselayers.com\&utm_medium=referral\&utm_campaign=integrations) is an email, SMS, and cross-channel marketing platform. The Layers integration lets you target merchandising rules, banners, blocks, product sequences, search, and sort orders at shoppers who arrive from a specific Listrak broadcast message, without pasting UTM strings by hand.

Once connected, Layers syncs your Listrak broadcast messages and their tracking UTMs on a rolling schedule and adds a **Campaign** field under the **Listrak** group in the [contextual conditions](/platform/merchandising/contextual-conditions) field picker. Selecting a message from the picker matches any shopper whose session UTMs (`utm_source`, `utm_medium`, `utm_campaign`) came from that send.

**Benefits:**

* Target merchandising at shoppers arriving from a specific Listrak send without copying UTMs by hand
* Consistent campaign targeting across every contextual surface (rules, banners, blocks, sequences, search, sort orders)
* Automatic sync keeps the message list current as you launch new broadcasts
* Falls back to the message subject line when a broadcast does not define a Google Analytics campaign name

**How it works:**

1. In Listrak, open **Integrations → Integration Management**, create an integration with type **Email**, and enable the **List** and **Message** areas. Note the generated **Client ID** and **Client Secret**.
2. Go to **Settings → Integrations** in the Layers dashboard and toggle **Listrak** on.
3. Enter the **Client ID** and **Client Secret** and select **Save changes**. Layers validates the credentials against the Listrak API.
4. The initial message sync starts automatically. Ongoing syncs run every 15 minutes with a wider daily reconciliation.
5. Open any surface that supports contextual conditions (for example, a merchandising rule) and select **Campaign** from the **Listrak** group in the condition field picker.
6. Select a message from the searchable dropdown. The condition matches when the shopper's session UTMs match that message's tracking values.

**Configuration:**

| Field | Description |
| :- | :- |
| **Client ID** | The Client ID from your Listrak email integration in **Integrations → Integration Management**. |
| **Client Secret** | The Client Secret paired with the Client ID. Stored encrypted. |

**Supported operators:**

The Listrak **Campaign** field supports two operators:

* **equals** — the rule matches only when the shopper arrived from the selected message
* **does not equal** — the rule matches every shopper *except* those who arrived from the selected message

**Which messages appear in the picker:**

The picker lists **broadcast** messages that have Google Analytics tracking enabled on their list and that resolve to a UTM campaign value. Layers uses the message's Google Analytics campaign name when set, otherwise the message subject. Triggered and transactional messages are not shown, because they cannot be uniquely matched by the shopper's session.

<Note>
  If a Listrak list has Google Analytics disabled, its messages are skipped during sync. Enable Google Analytics on the list in Listrak to make its broadcasts targetable in Layers.
</Note>

<Note>
  Campaign matching is case-insensitive and evaluated entirely from the shopper's session UTMs. There is no request-time call to Listrak, so campaign conditions do not add latency to search or browse requests.
</Note>

<Note>
  Newly launched broadcasts appear in the picker after the next sync (typically within 15 minutes).
</Note>

**Disconnecting:**

Toggle **Listrak** off in **Settings → Integrations** to disconnect. Layers stops syncing messages and hides the Listrak **Campaign** field. Existing merchandising rules that reference a Listrak message continue to evaluate against the stored UTM values until you remove them.

### Intelligems

[Intelligems](https://www.intelligems.io/?utm_source=docs.uselayers.com\&utm_medium=referral\&utm_campaign=integrations) is an A/B testing platform for Shopify that runs price, shipping, and content tests. Intelligems works alongside Layers with no integration setup — there is no toggle to enable.

**How it works:**

* Intelligems runs price tests on your store by updating product prices in Shopify and applying each shopper's test-group price through its storefront price updates and checkout adjustments.
* Product tiles rendered by Layers use standard price markup, so Intelligems displays each shopper's test-group price on them the same way it does everywhere else on your storefront.
* Price filters and price sorting in your search and collection results use the Shopify catalog price — the value Intelligems writes to your products when a test starts. Filtering and sorting can therefore differ from the test-group price your shopper sees displayed when that price differs from the catalog price.

## Event forwarding

When analytics integrations (Blotout, Clarity) are enabled, Layers forwards visual search and shop similar events to these services. The following events are forwarded:

| Event | Description |
| :- | :- |
| `similar-opened` | User opened the shop similar panel |
| `similar-closed` | User closed the shop similar panel |
| `similar-product-clicked` | User clicked a product in shop similar results |
| `image-search-opened` | User opened the image search panel |
| `image-search-closed` | User closed the image search panel |
| `image-search-search` | User performed an image search |
| `image-search-crop` | User cropped an image for search |
| `shop-similar-impression` | Shop similar recommendations were displayed |

## Implementation notes

* Integrations only forward events to services that are already loaded on your page
* Enabling integrations doesn't load any additional scripts
* All integrations respect your store's consent management settings
* Events are forwarded with the same payload structure as they are sent to Layers
* If an integration service is not available on the page, events will silently skip forwarding

## Requesting new integrations

Layers regularly adds new integrations based on merchant needs. If you use a tool that isn't currently supported, you can request it directly from the dashboard.

**To request a new integration:**

1. Go to **Settings → Integrations** in the Layers dashboard
2. Select **Request an integration** in the page header. The same button also appears when your search matches no integrations
3. Fill in the request form:
   * **Service name** — the tool or platform you want connected
   * **Category** — the closest matching category, or **Other**
   * **What should it do in Layers?** — which data should flow in and how you'd use it, such as sorting, filters, or targeting
4. Select **Send request**

The request goes to the Layers integrations team, who confirms scope and timeline by email. You can also email [support@uselayers.com](mailto:support@uselayers.com) with the same details.

The Layers team evaluates each request based on:

* Technical feasibility
* Merchant demand
* Privacy and performance considerations
* Alignment with Layers' integration principles

**Current integration priorities:**
Layers prioritizes integrations that enhance search personalization, improve analytics visibility, or enable better pricing and promotional capabilities. Analytics, loyalty, and customer data platforms are particularly well-suited for integration.

## Need help?

For questions about integrations or to request a new integration, contact [support@uselayers.com](mailto:support@uselayers.com).
